シェルスクリプトを使用して特定のサブディレクトリのみを新しいフォルダに移動する

シェルスクリプトを使用して特定のサブディレクトリのみを新しいフォルダに移動する

メール アカウントを含むフォルダーがありAccounts、これらのフォルダーすべてにフォルダーがありますArchive.folder。簡単なスクリプトを使用して、すべてのアーカイブ フォルダーを新しいフォルダーに移動したいと考えています。

これまで試したことは次のとおりです:

find . -mindepth 1 -maxdepth 1 ! -name archive -exec mv -t testnew/ {} + 

しかし、これは archive というフォルダーだけではなく、すべてのフォルダーを移動します。現在の 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ディレクトリが 1 つのファイルシステムに属していて、testnew別のファイルシステムに移動したい場合は、testnewソース ファイルシステムで作成し、使用してvidir、最後にtestnewターゲット ファイルシステムに移動します。
  • の終わりにこれは別の答えです非インタラクティブEDITORにするために悪用される実験的なアプローチがあります。しかしvidirvidirあなたのようなケースでは、名前の変更や移動を行う前に、結果のパスが本当に希望どおりのものかどうかを確認できるため、これが役立つと思います。何かを間違えた場合は、変更を保存せずに中止できます。問題に対する非対話型の解決策が必要な場合、これはvidir最適なツールではありません。

関連情報