Linux

如何在目前目錄的所有文件名中用另一個字元替換一個字元?

  • April 7, 2021

如何重命名目前文件夾中的所有文件/子目錄?

可以說,我有許多帶有空格的文件和子目錄,我想用下劃線替換所有空格。

File 1
File 2
File 3
Dir 1
Dir 3

應該改名為

File_1
File_2
File_3
Dir_1
Dir_3

如果您還需要重命名子目錄中的文件,並且您find支持-execdir謂詞,那麼您可以這樣做

find /search/path -depth -name '* *' \
   -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

感謝@glenn jackman 建議-depth選項find並讓我思考。

請注意,在某些系統(包括 GNU/Linux 系統)上,find可能無法找到名稱包含空格以及不構成有效字元的字節序列的文件(典型的媒體文件名稱包含以字元集編碼的非 ASCII 字元與地區不同)。將語言環境設置為C(如LC_ALL=C find...)將解決問題。

在任何 shell 中,您都可以遍歷名稱中包含空格的文件。在 bash、ksh 和 zsh 中,用下劃線替換空格很容易${VARIABLE//PATTERN/REPLACEMENT}

for x in *" "*; do
 mv -- "$x" "${x// /_}"
done

在 Debian、Ubuntu 和衍生產品上,您可以使用 Perl rename(其他發行版提供了一個不同的程序rename,而該程序在這裡沒有幫助)。

rename 's/ /_/g' *

一個強制性的 zsh 解決方案:

autoload zmv
zmv '(*)' '${1// /_}'

強制性 POSIX 解決方案:

for x in *" "*; do
 y=$(printf %sa "$x" | tr " " "_")
 mv -- "$x" "${y%a}"
done

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