ウェブサイトの移行作業を行っています。 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
仕組み:
- 次の方法で正しくコピーするファイルのリストを作成します。
$(find ...)
tar c
新しいtarアーカイブを作成し、それをstdoutに渡します。|
解凍するために、アーカイブを別のtarプロセスにパイプします。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 \;