需要遞歸尋找所有包含冒號的檔案名稱並將冒號替換為破折號?

需要遞歸尋找所有包含冒號的檔案名稱並將冒號替換為破折號?

我有一個目錄“main”,其中包含許多子目錄,並且在其中一些子目錄中,我的檔案名稱包含冒號。我將「main」目錄從 Linux 上傳到 GitHub 儲存庫,但當我嘗試在 Windows 電腦上從該儲存庫中提取內容時遇到了問題,因為 Windows 不允許檔案名稱中包含冒號。

如何使用 Linux 終端遞歸查找「主」目錄中帶有冒號的所有檔案名,然後將冒號替換為破折號 (-) 字元?

答案1

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(如果此命令不適合您,請參閱本答案末尾的兼容性說明。)

這是一個基本的安全版本,僅列印將發生的情況。為了讓它真正發生,擺脫-n選擇。

沒有它也可以工作,-name "*:*"但最好find只傳遞應該更改的文件名,因為這會使整個命令更快。

它的工作原理如下:

  • find發現...
    • ....在/path/to/directory目錄...
    • ....全部文件 (-type f)...
    • ....具有符合的名稱 ( -name "*:*"),...
    • ....然後執行rename(如果需要多次)...
    • :....用替換的模式-...
    • ....在所有找到的文件上,一次多個文件 ( {} +)。

筆記:

  • 該命令不會重新命名目錄,這是設計使然。
  • 對於檔案名稱中的某些不常見字元(例如換行符),重新命名可能不起作用。最肯定的是你那裡沒有這樣的檔名,所以這是一個相當正式的註解。

相容性說明

此解決方案使用Debian、Ubuntu 上可用的軟體包rename中的Perl 腳本。rename其他發行版可能rename來自util-linux.

本手冊建議非 Perl 的解決方案rename應該是:

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(再次,-n如果看起來正確,請將其刪除。)不過我還沒有對此進行測試。我認為它只會替換檔案名稱中的第一個冒號。解決方法是重複該指令(不帶-n、帶-v),直到沒有冒號為止。

或者,您可以從以下位置的存檔中取得 Perl 腳本:這個網站(目前File-Rename-0.20.tar.gz,該腳本名為rename.PL)。也可以看看這個問題

相關內容