在mac OS X上,如何让bash脚本工作以更改当前工作目录中的1,000个文件和子目录以及许多子子目录。
尝试使用来自Find and replace filename recursively in a directory回答的脚本,但是没有考虑具有前导或尾随空格的文件名或目录,因为需要转义空格。但是,正如您可以看到以下行,路径也被转义,脚本不起作用。
find . -name '* ' -type d -exec bash -c 'echo mv "$1"/ \""${1/ /}\""' -- {} \;
(注意:是的我使用echo查看命令。)
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
。
答案 0 :(得分:0)
从目录和文件中删除尾随空白:
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 {} \;
注意:
因此当find在其中搜索时不会重命名目录,我们需要指定-depth
。
The shell expansion ${1%"${1##*[^[:space:]]}"}
删除尾随空格,${f#"${f%%[![:space:]]*}"}
删除前导空格。
bash -c
的第一个非选项参数已分配给$0
,并在发生任何错误时用作错误消息中的程序名称。最好在此处使用描述性名称,例如上面显示的Move
。
以上是在Linux下测试的。
答案 1 :(得分:0)
你可以使用一个简单的for循环,并用下划线替换空格:
for FILE in *\ *
do
mv "$FILE" "${FILE// /_}"
done
对于多个子目录,您可以使用以下内容:
for FILE in ./* */* */* *; do mv "$FILE" "${FILE// /_}"; done 2>/dev/null