シェルのディレクトリから特定のファイルを抽出する方法は?

シェルのディレクトリから特定のファイルを抽出する方法は?

私はコマンドラインディレクトリを取得し、スクリプトが実行されている現在のディレクトリにすべての内容を抽出する単純なシェルスクリプトを作成しました。

#!/bin/bash
cp -v -R $1/* . 

これを拡張したいです。ディレクトリAのすべてのPNGファイルを抽出したいとしましょう。ただPNGファイルです。

最初は、.pngで終わるすべてのファイルをディレクトリから検索して分類しようとしましたが、これらのファイルだけをディレクトリにコピーする方法がわかりません。

答え1

誰でも

find "$1" -name '*.png' -exec cp -v -- {} ./ \;

または(GNUを使用cp)より効率的な方法

find "$1" -name '*.png' -exec cp -vt ./ -- {} +

あるいは、シェルがそれをサポートしている場合は、globbingを使用できます。bash

shopt -s globstar

cp -v -- "$1"/**/*.png ./

答え2

コピーが複雑になるとrsync便利です。

rsync -mva --include '*/' --include '*.png' --exclude '*' "$1/" .

ただし、実際に実行する前にテスト実行(オプション-n:)を実行して、必要に応じて機能していることを確認できます。

rsync -nmva --include '*/' --include '*.png' --exclude '*' "$1/" .

どのように動作しますか?

  • -v(オプション) rsync に何が起こっているのかを確認できるように詳細に説明するように指示します.

  • -a(オプション)属性を保存するようにrsyncに指示します。

  • --include '*/'すべてのディレクトリを含めるようにrsyncに指示する

  • --include '*.png'.pngサフィックスを含むすべてのファイルを含めるようにrsyncに指示します。

  • --exclude '*'上記と一致しないファイルを除外するようにrsyncに指示します。

  • -m受信側から空のディレクトリをコピーしないようにrsyncに指示します。

包含/除外オプションは順番に指定する必要があります。

答え3

明らかにbashを使用しているので、globstarファイル名拡張機能を使用できます。

shopt -s globstar
cp **/*.png /some/destination

ファイル名の競合に注意してください。 1つのファイル名だけがコピーに残ります!

関連情報