Bash

使用單個 bash 命令批量重命名文件夾

  • October 27, 2016

我有這樣的文件夾設置:

/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' */*

prenamePerl 重命名(任何變體都可以)。

這列印:

mv ...

這正是我要執行的命令。但我無法執行它。

我嘗試將輸出分配給一個變數並通過呼叫該變數來執行它。那沒有用。我嘗試了這個想法的一些變化,但我得到了錯誤。

感覺就像我在這裡缺少一些工具。

您正在尋找的簡單方法是附加| bash到您的命令。這就是您可以從“列印命令的命令”到“實際執行列印的命令”的方式。

但是,即使您在要列印的命令中包含雙引號,**在腳本中包含這也是一個壞主意。

您可能已經處理了空格方面,但是如果文件名直接包含雙引號字元怎麼辦?還是換行符?還是變數名(將在雙引號內展開)?

文件名中唯一非法的字元是斜杠 ( /) 和空字節。

在編寫腳本時,您應該讓自己保持比在互動式命令行中更高的健壯性標準。

在命令行中,您可以看到您將要執行的命令,您可以確認它是正確的,然後您可以執行它。在腳本中,沒有監督也沒有確認。腳本會按照您的指示去做,無論結果如何具有破壞性。

所以正確的做法其實是使用find,詳見我的其他回答。這將正確處理任何文件名,並且不包含任意程式碼執行漏洞。

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