イメージのみを再帰的にコピーし、パスを保存します。

イメージのみを再帰的にコピーし、パスを保存します。

ウェブサイトの移行作業を行っています。 URLに表示されるすべてのファイルとディレクトリ構造を含むWebサイトのスクリーンショットがあります。すべての画像を抽出し、ディレクトリ構造を維持し、新しい場所にコピーしたいと思います。

たとえば、私が持っている場合

/content1/index.php
/content1/page2.php
/content1/images/image1.jpg
/content1/images/image2.jpg
/content1/background/spacer.gif
/content1/background/background.gif
/content2/index.php
/content2/images/image3.jpg
/content2/background/spacer.gif
/content2/background/background.gif

だから私は欲しい

/content1/images/image1.jpg
/content1/images/image2.jpg
/content1/background/spacer.gif
/content1/background/background.gif
/content2/images/image3.jpg
/content2/background/spacer.gif
/content2/background/background.gif

コマンドを使用してイメージファイルのリストのみを取得できますが、findディレクトリパスを維持しながら各ファイルを操作する方法がわかりません。

ディレクトリ全体をコピーしてから画像ではなくファイルを再帰的に削除することはできますが、今この問題を自分自身の前に設定したので、実際にこれを行う必要がある場合に備えてどのように行うかを知る価値があると思います。未来。 。

答え1

次のコマンド(findおよびcpオプション--parent)を試してください。

find /source -regextype posix-extended -regex '.*(gif|jpg)' \
    -exec cp --parents {} /dest \; -print

答え2

使用公園(またはそれ以前のバージョンのcpioまたはtarのいずれか)がコピーモードになっています。必要なファイル(.jpgまたは.gif)のみをコピーするように指示します。構文は少しバイパスです。-sオプションはファイル名を空の名前に変更する方法を指定し、最初の一致が適用されるため、ほとんどのファイルを除外するには名前の変更を含めることをお勧めします。のファイル自体を削除し、残りのファイルを除外します。ディレクトリはこの方法ではコピーされませんが、paxがコピーしている場合は、foo/bar/qux.jpg必要に応じてターゲットにおよびを作成し、除外されfooたディレクトリ内でもpaxが繰り返されます。foo/bar

pax -rw -pp -s '!\.gif$!&!' -s '!\.jpg$!&!' -s '!.*!!' /content* /destination

rsyncを使用してコピーを実行することもできますが、面倒です。 rsyncは除外されたディレクトリをコピーしないため、すべてのディレクトリを含めてから空のディレクトリを削除またはコピーするディレクトリのリストを作成する必要があります。バラよりこの回答説明のために。

rsync -a --include='*.gif' --include='*.jpg' --include='*/' \
      --exclude='*' /content* /destination

答え3

すべての* .confファイルを/ etc /から/ tmp /にコピーするとします。以下を行う必要があります。

tar c $(find /etc/ -name '*.conf') | tar xv -C /tmp

仕組み:

  1. 次の方法で正しくコピーするファイルのリストを作成します。$(find ...)
  2. tar c新しいtarアーカイブを作成し、それをstdoutに渡します。
  3. |解凍するために、アーカイブを別のtarプロセスにパイプします。
  4. tar xv標準入力から詳細な抽出アーカイブを読みます。ただし、ディレクトリは/tmp(対象)に変更されます。

この方法では、スペースを含むファイルを正しく処理できません。この問題を解決するには、ファイルのリストを生成し、-T オプションを最初の tar コマンドに渡すことができます。

答え4

同じ答えですが、Mac--parentsでは動作しないため、Macの場合ですcp

 find /source/dir -type f \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.jpeg"   \) -exec rsync -R {} ../destination/dir \;

関連情報