arm*_*ino 244 linux bash filenames whitespace
任何人都可以推荐一个安全的解决方案,从给定的根目录开始递归地用文件和目录名称中的下划线替换空格?例如:
$ tree
.
|-- a dir
| `-- file with spaces.txt
`-- b dir
|-- another file with spaces.txt
`-- yet another file with spaces.pdf
Run Code Online (Sandbox Code Playgroud)
变为:
$ tree
.
|-- a_dir
| `-- file_with_spaces.txt
`-- b_dir
|-- another_file_with_spaces.txt
`-- yet_another_file_with_spaces.pdf
Run Code Online (Sandbox Code Playgroud)
Nai*_*dim 326
我用:
for f in *\ *; do mv "$f" "${f// /_}"; done
Run Code Online (Sandbox Code Playgroud)
虽然它不是递归的,但却非常快速和简单.我相信这里有人可以将它更新为递归.
"$ {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.
Pau*_*ce. 290
使用rename(又名prename)Perl脚本,它可能已经在您的系统上.分两步完成:
find -name "* *" -type d | rename 's/ /_/g' # do the directories first
find -name "* *" -type f | rename 's/ /_/g'
Run Code Online (Sandbox Code Playgroud)
根据于尔根的答案,并能处理文件和目录的多层纵身使用的"修订版1.5 1998年12月18日16时16分31秒1元"的版本/usr/bin/rename(Perl脚本):
find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
Run Code Online (Sandbox Code Playgroud)
Mic*_*ker 100
find . -depth -name '* *' \
| while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done
Run Code Online (Sandbox Code Playgroud)
一开始没能把它弄好,因为我没有想到目录.
小智 27
你可以使用detoxDoug Harple
detox -r <folder>
Run Code Online (Sandbox Code Playgroud)
Jür*_*zel 11
一个查找/重命名的解决方案.rename是util-linux的一部分.
您需要先降低深度,因为空白文件名可以是空白目录的一部分:
find /tmp/ -depth -name "* *" -execdir rename " " "_" "{}" ";"
Run Code Online (Sandbox Code Playgroud)
bash 4.0
#!/bin/bash
shopt -s globstar
for file in **/*\ *
do
mv "$file" "${file// /_}"
done
Run Code Online (Sandbox Code Playgroud)
小智 5
你可以用这个:
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
Run Code Online (Sandbox Code Playgroud)
在 macOS 中
就像所选择的答案一样。
brew install rename
#
cd <your dir>
find . -name "* *" -type d | rename 's/ /_/g' # do the directories first
find . -name "* *" -type f | rename 's/ /_/g'
Run Code Online (Sandbox Code Playgroud)