我有一個目錄“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
)。也可以看看這個問題。