在 mac OS X 上,如何让 bash 脚本能够更改当前工作目录中的 1,000 个文件和子目录以及许多子子目录。
尝试使用在目录中递归查找和替换文件名答案中的脚本,但是,这没有考虑具有前导或尾随空格的文件名或目录,因为需要转义空格。然而,正如您所看到的下面的行,路径也被转义并且脚本不起作用。
find . -name '* ' -type d -exec bash -c 'echo mv "$1"/ \""${1/ /}\""' -- {} \;
bash 脚本需要修剪文件和目录的前导和尾随空格。我所说的“修剪”是指删除前导和尾随空格,并仅保留单词之间的空格。
结构示例:
./
./ Leading Space/
./ Leading Space/ Text File With Leading Space.txt
./Trailing Space /
./Trailing Space / Multiple Trailing and Leading Spaces /
./Trailing Space / Multiple Trailing and Leading Spaces / Trailing and Leading Spaces Text File .txt
注意:答案需要在任何默认的 mac OS X 上工作。我不会接受使用第三方应用程序或插件的答案,包括 Mac Automator 和 perl
rename
。
find . -depth -name '* ' -execdir bash -c 'mv "$1" "${1%"${1##*[^[:space:]]}"}"' Move {} \;
要删除前导空格:
find . -depth -name ' *' -execdir bash -c 'f=${1#./}; mv "./$f" "./${f#"${f%%[![:space:]]*}"}"' Move {} \;
备注:
-depth
。
shell 扩展 ${1%"${1##*[^[:space:]]}"}
删除尾随空白,而
${f#"${f%%[![:space:]]*}"}
删除前导空白。
bash -c
的第一个非选项参数被分配给
$0
,并在发生任何错误时用作错误消息中的程序名称。 最好在此处使用描述性名称,如上所示的
Move
。
for FILE in *\ *
do
mv "$FILE" "${FILE// /_}"
done
对于多个子目录,你可以使用这样的东西:
for FILE in ./* */* */* *; do mv "$FILE" "${FILE// /_}"; done 2>/dev/null