Shell

如何使用查找/重命名重命名多個文件名

  • July 5, 2017

我在 Samba 伺服器上有很多包含特殊字元的目錄/子目錄中的文件。問題是,當我嘗試使用 Windows 查看文件時,這些文件(包含特殊字元)不可見。所以我寫了命令(在下面)來更改帶有特殊字元的文件的名稱,但是將重命名的文件放回 dirs/subdirs 不能正常工作:

find . -type f -exec rename -v 's/[^a-zA-Z0-9 &](?=[^.]*\.)/_/g' '{}' \;

在底部我發布包含要重命名的文件的目前目錄:

./dir 1/fil[special char]e3.jpg
./dir 1/another dir2/m[special char]r.file1.txt
./dir 1/another dir2/file[special char]2.doc
./dir 3/next dir4/dir 5/fi[special char]le5.xml
./file 4.zip

期望 - 使用上述命令後(目錄/子目錄中的文件):

./dir 1/fil_e 3.jpg
./dir 1/another dir2/m_r_file1.txt
./dir 1/another dir2/file_2.doc
./dir 3/next dir4/dir 5/fi_le5.xml
./file 4.zip

現實 - 我執行命令的同一文件夾中的文件:

__dir 1_fil_e 3.jpg
__dir 1_another dir 2_m_r_file1.txt
__dir 1_another dir 2_file_2.doc
__dir 3_next dir4_dir 5_fi_le5.xml
__file 4.zip

我有兩個問題:

  1. 如何從文件名中排除路徑名?
  2. 如何將文件放入目錄?

如果有,請使用-execdir選項 forfind而不是-exec.

  • -exec從命令的根目錄執行命令,每個路徑作為參數
  • -execdir在目標目錄中執行命令,每個文件名作為參數

因此,

find . -type f -execdir rename -v 's/[^a-zA-Z0-9 &](?=[^.]*\.)/_/g' '{}' \;

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