我尝试了以下 shell 脚本,该脚本应该替换所有 xml 文件名中的空格
for xml_file in $(find $1 -name "* .xml" -type f);
do
echo "removing spaces from XML file:" $xml_file
mv "$xml_file" "${xml_file// /_}";
done
假设我有一个名为 的 xml 文件xy z.xml
,那么它给出:
removing spaces from XML file: /home/krishna/test/xy
mv: cannot stat `/home/krishna/test/xy': No such file or directory
removing spaces from XML file: .xml
mv: cannot stat `z.xml': No such file or directory
答案1
将此与以下内容一起使用bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
将搜索名称中带有空格的文件。文件名将使用空字节 ( -print0
) 作为分隔符打印,以处理特殊文件名。然后read
内置函数读取由空字节分隔的文件名,最后mv
用下划线替换空格。
编辑:如果您也想删除目录中的空格,那就有点复杂了。目录被重命名,然后无法再通过名称find
查找来访问。尝试这个:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
反转sort -rz
文件顺序,以便文件夹中最深的文件是第一个移动的,而文件夹本身将是最后一个。因此,在重命名其中的所有文件和文件夹之前,永远不会重命名文件夹。mv
循环中的命令也发生了一些变化。在目标名称中,我们仅删除文件基本名称中的空格,否则将无法访问该文件。
答案2
使用
rename
find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
或与
$1
find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
使用
mv
find . -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
或与
$1
find "$1" -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
答案3
这是我遇到同样问题时发现的方法:
for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done
我正在编写一个 bash 脚本文件来自动更新我的 ssl 证书。
答案4
使用rename
:
rename 's/\s/_/g' ./*.xml
不需要find
:)