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


17

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

Answers:


28

结合使用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循环中的命令也有所更改。在目标名称中,我们仅删除文件基本名称中的空格,否则将无法访问。


我正在尝试在所有目录中用下划线替换空格,但它给出了错误,因为更改名称后该目录不可访问。
克里希纳,2015年

@krishna我在答案中添加了修改。
2015年

1
@chaos哇,只是在两个系统上运行了这两个,它就像一个咒语,很少有文件和目录没有通过,但只有少数
有点东西

在macOS上,我们需要在-name选项之前在find命令中指定目录 find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Laszlo Pinter

17
  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// /_}"' {} \;

我不知道为什么,但是您给定的命令对我不起作用。它没有显示任何错误和输出。
克里希纳

@krishna已更正,对不起
AB

1
重命名为我工作。拳头!
Brian Piercy

1

这是我在遇到相同问题时发现的一种方法:

for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.