使用 shell 腳本僅將某個子目錄移至新資料夾

使用 shell 腳本僅將某個子目錄移至新資料夾

我有一個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可能是個好方法。看這個答案

在您的情況下,程式將類似於:

  1. cd /path/to/Accounts
    find . -type d -name archive | vidir -
    
  2. vidir將運行文字編輯器。使用「搜尋和替換」並將每個前導替換./為您想要的任何路徑,以便這些行符合您所需的目錄結構。路徑可以是絕對路徑或相對路徑,它們可以包含../.例如,您可以輕鬆地轉動它

    ./1/archive
    ./2/archive
    ./3/archive
    

    進入這個

    ../testnew/1/archive
    ../testnew/2/archive
    ../testnew/3/archive
    
  3. 儲存編輯後的檔案並退出編輯器。

筆記:

  • 如果您的目錄結構包含名稱以 結尾的目錄.(因此./子字串不僅出現在開頭),那麼最好替換<TAB>./<TAB>whatever/path/you/want/,其中<TAB>表示製表符。是否/如何將該字元包含在“搜尋和替換”中取決於編輯器。
  • 透過指定來選擇您的編輯器EDITOR,例如find … | EDITOR=kate vidir -
  • vidir無法在檔案系統之間移動檔案。如果所有archive目錄都屬於一個檔案系統,而您希望testnew位於另一個檔案系統中,則testnew在來源檔案系統中建立、使用vidir並最終移動testnew到目標檔案系統。
  • 在......的最後這是另一個答案(ab) 使用實驗方法EDITOR來實現vidir非交互作用。然而我發現vidir在像您這樣的情況下很有用,主要是因為它允許我在發生任何重命名/移動之前確保生成的路徑確實是我想要的。如果我搞砸了任何事情,我可以中止而不儲存更改。如果您想要一個非互動式解決方案來解決您的問題,那麼這vidir不是最好的工具。

相關內容