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