Jer*_*ska 3 find shell-script recursive regular-expression rename
我有一个重命名脚本,去掉空格,每个目录和文件。它递归地执行:
#!/bin/bash
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Run Code Online (Sandbox Code Playgroud)
当我在我的~目录中运行它时,脚本造成了一些意外的破坏,重命名了以下项目:
./.cache/google-chrome/Default/Storage/ext/nmmhkkegccagdldgiimedpiccmgmieda/def/Code Cache./.cache/google-chrome/Default/Storage/ext/gfdkimpbcpahaombhbimeihdjnejgicl/def/Code Cache./.cache/google-chrome/Default/Code Cache我希望我的脚本排除任何以.重命名开头的目录或文件。你会怎么写这样的剧本?是否需要为此使用正则表达式?
无需过多查看管道中的其他命令,您就find可以避免进入任何具有隐藏名称的目录:
find . ! -path . -name '.*' -prune -o -name '* *' -print0 | ...
Run Code Online (Sandbox Code Playgroud)
这将从.搜索树中删除名称开头的所有目录,.目录(当前目录)除外。它也不会再找到隐藏的名字。
查看了您的其余代码后,我建议改用rename(Perl 变体):
find . ! -path . -name '.*' -prune \
-o -type f -name '* *' -execdir rename -n -v 'tr/ /_/' {} \;
Run Code Online (Sandbox Code Playgroud)
这将搜索包含空格的文件名,然后用下划线替换其中的所有空格,同时忽略隐藏名称并且不进入隐藏目录。
rename调用该实用程序-n以阻止它实际执行任何操作(这是“试运行”)。-n当您确信它正在做正确的事情时删除。
没有rename,你会做类似的事情
find . ! -path . -name '.*' -prune \
-o -type f -name '* *' -exec bash -c '
for pathname do
filename=${pathname##*/}
echo mv "$pathname" "${pathname%/*}/${filename// /_}"
done' bash {} +
Run Code Online (Sandbox Code Playgroud)
也就是说,调用一个bash内嵌脚本来迭代找到的名称,通过将空格更改为下划线来重命名每个名称。
echo当您确信这会做正确的事情时,请删除它。