我在將資料夾傳輸到外部硬碟時遇到問題 - 我不想更改硬碟上的格式。
所以文件夾中有 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
如果您願意的話)或tr
或tr -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
。