使用單個 bash 命令批量重命名文件夾
我有這樣的文件夾設置:
/path/to/directory/SLUG_1/SLUG_1 - SLUG_2 - SLUG_3
SLUG_2 是年份,年份後面可能有一個字母,如“1994”或“2003a”。
我想將這些文件重命名為:
/path/to/directory/SLUG_1/SLUG_2 - SLUG_3
我已經非常接近這個命令了:
find $root -mindepth 2 -maxdeth 2 -type d | sed "s#\(\(/path/to/directory/[^/]*/\).* - \([0-9]\{4\}[a-bA-B]\? - .*\)\)#mv "\1" "\2\3"#
這列印:
mv "/path/to/directory/SLUG_1/SLUG_1 - SLUG_2 - SLUG_3" "/path/to/directory/SLUG_1/SLUG_2 - SLUG_3"
這正是我要執行的命令。但我無法執行它。
我嘗試將輸出分配給一個變數並通過呼叫該變數來執行它。那沒有用。我嘗試了這個想法的一些變化,但我得到了錯誤。
感覺就像我在這裡缺少一些工具。一些使這項工作變得容易的迭代工具。有什麼建議麼?
假設所有子目錄都
/path/to/directory
遵循該命名約定:cd /path/to/directory prename -n 's~/\d{4}[a-z]? - ~/~i' */*
prename
是Perl 重命名(任何變體都可以)。
這列印:
mv ...
這正是我要執行的命令。但我無法執行它。
我嘗試將輸出分配給一個變數並通過呼叫該變數來執行它。那沒有用。我嘗試了這個想法的一些變化,但我得到了錯誤。
感覺就像我在這裡缺少一些工具。
您正在尋找的簡單方法是附加
| bash
到您的命令。這就是您可以從“列印命令的命令”到“實際執行列印的命令”的方式。但是,即使您在要列印的命令中包含雙引號,**在腳本中包含這也是一個壞主意。
您可能已經處理了空格方面,但是如果文件名直接包含雙引號字元怎麼辦?還是換行符?還是變數名(將在雙引號內展開)?
文件名中唯一非法的字元是斜杠 (
/
) 和空字節。在編寫腳本時,您應該讓自己保持比在互動式命令行中更高的健壯性標準。
在命令行中,您可以看到您將要執行的命令,您可以確認它是正確的,然後您可以執行它。在腳本中,沒有監督也沒有確認。腳本會按照您的指示去做,無論結果如何具有破壞性。
所以正確的做法其實是使用
find
,詳見我的其他回答。這將正確處理任何文件名,並且不包含任意程式碼執行漏洞。