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

kri*_*hna 31 find shell-script rename files mv

我尝试遵循 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
Run Code Online (Sandbox Code Playgroud)

假设,我有名称为 的 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
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 41

使用它bash

find $1 -name "* *.xml" -type f -print0 | \
  while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
Run Code Online (Sandbox Code Playgroud)

find将搜索名称中带有空格的文件。文件名将使用空字节 ( -print0) 作为分隔符打印,以处理特殊文件名。然后read内置函数读取由空字节分隔的文件名,最后mv用下划线替换空格。

编辑:如果你也想删除目录中的空格,那就有点复杂了。目录被重命名,然后无法再通过名称find查找进行访问。尝试这个:

find -name "* *" -print0 | sort -rz | \
  while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Run Code Online (Sandbox Code Playgroud)

sort -rz反转文件顺序,使文件夹中的文件最深的是移动第一个和文件夹本身将是最后一个。因此,在所有文件和文件夹在其中重命名之前,永远不会重命名文件夹。mv循环中的命令也略有变化。在目标名称中,我们只删除文件基本名称中的空格,否则将无法访问。

  • 在 macOS 上,我们需要在 find 命令中的 -name 选项 `find 之前指定目录。-name "* *" -print0 | 排序-rz | \ while 读取 -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; 完成` (2认同)

A.B*_*.B. 28

  1. 使用 rename

    find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    
    Run Code Online (Sandbox Code Playgroud)

    或与 $1

    find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 mv

    find . -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
    
    Run Code Online (Sandbox Code Playgroud)

    或与 $1

    find "$1" -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
    
    Run Code Online (Sandbox Code Playgroud)


Nek*_*aki 6

这是我在面临同样问题时发现的一种方法:

for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done
Run Code Online (Sandbox Code Playgroud)

我正在编写一个 bash 脚本文件来自动更新我的 ssl 证书。


Jan*_*ven 5

使用rename

rename 's/\s/_/g' ./*.xml
Run Code Online (Sandbox Code Playgroud)

不需要find:)