任何人都可以推荐一个安全的解决方案,从给定的根目录开始递归地用文件和目录名称中的下划线替换空格?例如:
$ tree . |-- a dir | `-- file with spaces.txt `-- b dir |-- another file with spaces.txt `-- yet another file with spaces.pdf
变为:
$ tree . |-- a_dir | `-- file_with_spaces.txt `-- b_dir |-- another_file_with_spaces.txt `-- yet_another_file_with_spaces.pdf
Naidim.. 326
我用:
for f in *\ *; do mv "$f" "${f// /_}"; done
虽然它不是递归的,但却非常快速和简单.我相信这里有人可以将它更新为递归.
"$ {f ///_}"部分利用bash的参数扩展机制,用提供的字符串替换参数中的模式.相关语法是"$ {parameter/pattern/string}".请参阅:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html或http://wiki.bash-hackers.org/syntax/pe.
我用:
for f in *\ *; do mv "$f" "${f// /_}"; done
虽然它不是递归的,但却非常快速和简单.我相信这里有人可以将它更新为递归.
"$ {f ///_}"部分利用bash的参数扩展机制,用提供的字符串替换参数中的模式.相关语法是"$ {parameter/pattern/string}".请参阅:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html或http://wiki.bash-hackers.org/syntax/pe.
使用rename
(又名prename
)Perl脚本,它可能已经在您的系统上.分两步完成:
find -name "* *" -type d | rename 's/ /_/g' # do the directories first find -name "* *" -type f | rename 's/ /_/g'
根据于尔根的答案,并能处理文件和目录的多层纵身使用的"修订版1.5 1998年12月18日16时16分31秒1元"的版本/usr/bin/rename
(Perl脚本):
find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
find . -depth -name '* *' \ | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done
一开始没能把它弄好,因为我没有想到目录.
你可以使用detox
Doug Harple
detox -r
一个查找/重命名的解决方案.rename是util-linux的一部分.
您需要先降低深度,因为空白文件名可以是空白目录的一部分:
find /tmp/ -depth -name "* *" -execdir rename " " "_" "{}" ";"
bash 4.0
#!/bin/bash shopt -s globstar for file in **/*\ * do mv "$file" "${file// /_}" done
你可以用这个:
find . -name '* *' | while read fname do new_fname=`echo $fname | tr " " "_"` if [ -e $new_fname ] then echo "File $new_fname already exists. Not replacing $fname" else echo "Creating new file $new_fname to replace $fname" mv "$fname" $new_fname fi done