Shell-Script

如何使用shell腳本在Linux中用下劃線替換所有文件名中的空格?

  • November 5, 2019

我嘗試了以下 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

將此用於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命令也有所改變。在目標名稱中,我們只刪除文件基本名稱中的空格,否則將無法訪問。

引用自:https://unix.stackexchange.com/questions/223182