如何使用shell脚本在Linux中用下划线替换所有文件名中的空格?

如何使用shell脚本在Linux中用下划线替换所有文件名中的空格?

我尝试了以下 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

  1. 使用rename

    find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    

    或与$1

    find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    
  2. 使用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:)

相关内容