ウェブサイト検索

Linux でディレクトリ構造を維持しながら特定のファイル タイプをコピーする


少し前に、Linux で特定の種類のファイルをあるディレクトリから別のディレクトリにコピーする方法を学びました。今日は同じことを行いますが、ディレクトリ構造も保持します。この簡単なチュートリアルでは、Linux でディレクトリ構造を維持しながら特定のファイル タイプをコピーする方法を説明します。ここでは、これを行うための 2 つの異なる方法を紹介しました。自分に合ったものを選んでください。

Linux でディレクトリ構造を維持しながら特定のファイル タイプをコピーする

このシナリオを想像してみてください。

「Linux」 という名前のディレクトリがあり、さまざまな種類のファイルがさまざまなサブディレクトリに保存されています。次のディレクトリ構造を見てください。

$ tree Linux/
Linux/
├── dir1
│   ├── English
│   │   └── Kina - Can We Kiss Forever.mp3
│   ├── Instrumental
│   │   └── Chill Study Beats.mp3
│   └── Tamil
│       ├── Kannan Vanthu.mp3
│       └── yarenna.mp3
├── dir2
│   ├── file.docx
│   └── Raja Raja Chozan Naan.mp3
├── dir3
│   ├── Bamboo Flute - Meditation - Healing - Sleep - Zen.mp3
│   └── pic.jpg
└── dir4
    ├── Aaruyirae.mp3
    └── video.mp4

7 directories, 10 files

ツリーコマンドを使用してディレクトリの内容を一覧表示する

上記のディレクトリ構造からわかるように、Linux ディレクトリには、dir1dir2dir3 という 4 つのサブディレクトリがあります。 > とdir4mp3 ファイルは 4 つのサブディレクトリすべてに分散されています。ここで、 すべてのmp3 ファイルを「ostechnix」 という名前の別のディレクトリにコピーし、ターゲット ディレクトリ内でも同じディレクトリ構造を維持したいと考えています。

まず、「find」コマンドを使用してこれを行う方法を見てみましょう。

方法 1 - 「find」コマンドと「cp」または「cpio」コマンドを使用する

ソース ディレクトリに移動します。

cd Linux/

そして、「find」コマンドを使用して、すべての mp3 ファイル タイプをコピーします。

find . -name '*.mp3' -exec cp --parents \{\} ~/ostechnix \;

上記のコマンドを分解して、各オプションが何を行うかを見てみましょう。

  • find – Unix のようなシステムでファイルとフォルダーを検索するコマンド。
  • ドット (.) - 現在のディレクトリから内容をコピーすることを表します。
  • -iname ‘*.mp3’ – 拡張子 .mp3 に一致するファイルを検索します。
  • -exec cp – 「cp」コマンドを実行して、ソース ディレクトリから宛先ディレクトリにファイルをコピーします。
  • --parents - 親ディレクトリ構造を保持するために、必要に応じて中間の親ディレクトリを作成します。
  • \{\} – は、「find」コマンドで見つかったファイルのファイル名に自動的に置き換えられます。また、一部の「find」コマンド バージョンでは、シェルによる展開から保護するために、中括弧がエスケープされています。エスケープ文字を使用せずに {} を使用することもできます。
  • ~/ostechnix – 一致するファイルを保存するターゲット ディレクトリ。
  • \; – 実行するコマンドが完了し、次の一致でコマンドを再度実行することを示します。

このコマンドは、すべての mp3 タイプのファイルを ~/Linux ディレクトリから ~/ostechnix ディレクトリに見つけてコピーします。また、ターゲット ディレクトリ内に同じディレクトリ構造が保存されます。

以下のように両方の場所で「tree」コマンドを使用して確認できます。

Linuxでtreeコマンドを使用してディレクトリの内容を一覧表示する

上記の出力でわかるように、宛先ディレクトリには mp3 ファイルのみが含まれており、そのディレクトリ構造はソース ディレクトリと同じです。

他の場所からこれを行う場合は、以下のようにソース ディレクトリのフル パスを指定します。

find ~/Linux -name '*.mp3' -exec cp --parents \{\} ~/ostechnix \;

このコマンドは、Linux/<サブディレクトリ> の場所にあるすべてのファイルを検索し、ostechnix/~/Linux/<サブディレクトリ> にコピーします。

Linux でディレクトリ構造を維持しながら特定のファイル タイプをコピーする

--parents オプションが機能しない場合は、 find コマンドと cpio コマンドを組み合わせて、ディレクトリ構造を維持したままファイルをコピーできます。

find . -name '*.mp3' | cpio -pdm  ~/ostechnix

ここ、

  • cpio - アーカイブとの間でファイルをコピーするコマンド。
  • -p - 標準入力からファイル名のリストを読み取り、指定されたディレクトリにコピーします。
  • -d - 必要な場所にディレクトリを作成します。
  • -m - ファイルの変更時間を保存します。

詳細については、マニュアルページを参照してください。

man find
man cp
man cpio

推奨読書:

  • 特定のフォルダ内の類似した種類のファイルを自動的に整理する方法

方法 2 - Rsync を使用する

Rsync は、ローカル システムとリモート システムの間で使用される強力なツールです。親ディレクトリ構造を維持したまま、特定の種類のファイルをあるディレクトリから別のディレクトリにコピーするには、次のコマンドを実行します。

rsync -a -m --include '*/' --include '*.mp3' --exclude '*' ~/Linux/ ~/ostechnix

または、

rsync -a --prune-empty-dirs --include '*/' --include '*.mp3' --exclude '*' ~/Linux/ ~/ostechnix

ここ、

  • rsync - リモート (およびローカル) ファイル コピー ツール。
  • -a - ほぼすべて (シンボリックリンク、変更日、ファイル権限、所有者など) を保存するアーカイブ モード
  • -m、--prune-empty-dirs - ソース ツリーから空のディレクトリを削除します。空のディレクトリを含めたい場合は、上記のコマンドからこのオプションを削除してください。
  • --include="*/" --include="*.mp3" --exclude="*" - 特定のファイルのみを含めるには、まずそれらの特定のファイルを含めてから、すべてのファイルを除外する必要があります。他のファイル。この例では、*.mp3 ファイルを含め、その他はすべて除外しました。
  • ~/Linux - ソース ディレクトリ。
  • ~/ostechnix - 宛先ディレクトリ。

サンプル出力:

Linux で Rsync を使用してディレクトリ構造を維持しながら特定のファイル タイプをコピーする

詳細については、マニュアルページを参照してください。

man rsync

お役に立てれば。

関連記事