Shell

如何使用 find 命令從文件名中刪除 (1)

  • May 22, 2012

我最近在我的 Mac OS 10.7 (Lion) 上使用 XLD 將我的所有 FLAC 文件轉換為 44.1 kHz 的較低採樣率和 24 位的位深度(因為 iPhone/iPod 不支持高於此的任何內容)。

雖然我告訴 XLD 覆蓋所有以前的文件,但 XLD(1)在非常文件的末尾附加了一個

some_song.m4a

some_song(1).m4a

所以現在我想(1)從我轉換的所有 FLAC 文件中刪除它。

我知道我可能使用了一些程序甚至 AppleScript 來重命名文件,但我想學習使用老式的命令行方式。

我知道這find . -name *\(1\).m4a將獲取所有轉換後的 FLAC 文件。

接下來我知道我必須對所有找到的文件做一些事情-exec並重命名。mv但我不知道如何保留原始文件名並僅刪除(1).

也許我需要進行一些組正則表達式擷取來儲存我不想修改的文件名部分?或者也許不可能在一行中完成所有事情,我應該創建一個 shell 腳本(我不太喜歡這樣做,但我願意嘗試一下)。

歡迎任何提示或建議!謝謝!

find除非萬不得已,否則不要嘗試解析輸出。重要的是要認識到,在 Unix 文件系統上,文件名不是字元串(一種常見的誤解),而是可以包含除空字元以外的任何字元的二進制 blob 。/安全、正確地解析文件名已經夠痛苦了,99% 的時間你只想完全避免這樣做(看看@yarek 的答案sed中的表達有多毛茸茸,即使這並不涵蓋所有情況) . 值得慶幸的是,在這種情況下,有一個更簡單的方法:

find . -name '*(1).m4a' -execdir sh -c \
'for arg; do mv "$arg" "${arg%(1).m4a}".m4a; done' _ {} \+

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