
我有一個Accounts
包含郵件帳戶的資料夾,所有這些資料夾都有一個資料夾Archive.folder
.我想用一個簡單的腳本將所有存檔資料夾移動到一個新資料夾。
到目前為止我嘗試過:
find . -mindepth 1 -maxdepth 1 ! -name archive -exec mv -t testnew/ {} +
但它會移動所有資料夾,而不僅僅是所謂的存檔資料夾。我想找到當前資料夾中名為 archive 的所有資料夾,並將它們移到資料夾 testnew/ 中。移動資料夾的路徑應與之前相同。
現有情況:
Accounts
- 1
- archive
- inbox
- folder2
- 2
- archive
- inbox
- folder2
- 3
- archive
- inbox
- folder2
它應該是什麼樣子:
testnew
- 1
- archive
- 2
- archive
- 3
- archive
答案1
如果可以交互地執行此操作,vidir
可能是個好方法。看這個答案。
在您的情況下,程式將類似於:
cd /path/to/Accounts find . -type d -name archive | vidir -
vidir
將運行文字編輯器。使用「搜尋和替換」並將每個前導替換./
為您想要的任何路徑,以便這些行符合您所需的目錄結構。路徑可以是絕對路徑或相對路徑,它們可以包含../
.例如,您可以輕鬆地轉動它./1/archive ./2/archive ./3/archive
進入這個
../testnew/1/archive ../testnew/2/archive ../testnew/3/archive
儲存編輯後的檔案並退出編輯器。
筆記:
- 如果您的目錄結構包含名稱以 結尾的目錄
.
(因此./
子字串不僅出現在開頭),那麼最好替換<TAB>./
為<TAB>whatever/path/you/want/
,其中<TAB>
表示製表符。是否/如何將該字元包含在“搜尋和替換”中取決於編輯器。 - 透過指定來選擇您的編輯器
EDITOR
,例如find … | EDITOR=kate vidir -
。 vidir
無法在檔案系統之間移動檔案。如果所有archive
目錄都屬於一個檔案系統,而您希望testnew
位於另一個檔案系統中,則testnew
在來源檔案系統中建立、使用vidir
並最終移動testnew
到目標檔案系統。- 在......的最後這是另一個答案(ab) 使用實驗方法
EDITOR
來實現vidir
非交互作用。然而我發現vidir
在像您這樣的情況下很有用,主要是因為它允許我在發生任何重命名/移動之前確保生成的路徑確實是我想要的。如果我搞砸了任何事情,我可以中止而不儲存更改。如果您想要一個非互動式解決方案來解決您的問題,那麼這vidir
不是最好的工具。