從檔案名稱中刪除某些特殊字符

從檔案名稱中刪除某些特殊字符

我在將資料夾傳輸到外部硬碟時遇到問題 - 我不想更改硬碟上的格式。

所以文件夾中有 100 個文件,阻止我複製它們的錯誤來自特殊字符(我不知道到底是哪個,但我相信它的“|”和“.”,而且我確信還有其他字符。我'已經手動重命名/刪除它們,但這很痛。

接受建議,但我「猜測」我正在尋找一種方法來從檔案名稱中刪除這些特定字元(這樣做會導致 .m4a 等出現問題嗎?),或者在必要時用下劃線替換它們。我的唯一線索是 perl rename,但我還沒有嘗試過。

像這樣重命名 'y/|/_/' * 嗎?

感謝您的任何建議

答案1

是的,(基於 Perl 的)rename指令是一個很好的選擇。您可以新增-n--nono選項來試運行替代品,例如:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

例如

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

請注意,rename不是如果檔案名稱不唯一,您可以破壞性地覆蓋檔案:

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

注意.不是文件名上下文中的特殊字符,因此我建議不要實際替換它。

答案2

一般來說,mmv非常適合批次重命名任務。

但在這種特殊情況下,我會採取完全不同的路線:使用幾個 shell 指令產生一個 shell 腳本,仔細查看它是否確實是我想要的,然後執行它。

大致輪廓:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Q會在每個名稱周圍加上雙引號,即它會給你"foo*bar"or "foo | bar"

/tmp/new.txt然後使用編輯器手動替換 中不需要的字符,或使用sed -i -e(或perl -p -i -e如果您願意的話)或trtr -d。重要的:不要更改該文件中的順序,也不要刪除或新增任何行!

無論如何,仔細檢查一下,/tmp/new.txt看看它是否真的是您想要的新名稱。

檢查是否有重複的名稱! ( sort /tmp/new.txt | uniq -r) 確保沒有重複項,如果有,請手動編輯該行以獲得唯一的名稱。

然後將文件與paste命令放在一起,並將每一行更改為mv命令:

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

這個paste指令的作用是取出一行/tmp/old.txt和一行/tmp/new.txt並將它們放在一行上,中間有一個空格。該sed部分mv -n在每行的開頭添加了一個。mv -n防止覆蓋現有文件。

該文件現在包含很多行,例如

mv -n "foo" "bar"
mv -n "abc" "def"

再次查看該文件,當您確定這就是您想要的文件時,請使用 執行它sh /tmp/bulk-rename

相關內容