私はUnixに初めてアクセスし、いくつかのzipファイルから特定のパターンファイル名を抽出しようとしています。私はfind
zipファイルを見つけて、zipファイルにあるCTLというファイルを抽出しようとしましたa*b*zip
。
$ unzip -jn 'find $source_dir -mtime -$st_d -daystart -iname "a*zip"' \
*CTL* -d $target_dir`
これに加えて、以下を試してみました。
$ find -type f -newermt $start_date \! -newermt $end_date -name "a*zip" \
| while read filename; do unzip -d $target_dir; done;`
しかし、これはすべてのファイルを抽出するものですが、ファイル名を持つファイルだけを探しています。CTL。
答え1
単独で使用すると、簡単にfind -exec
これを行うことができます。
find . -type f -name '*.zip' -exec unzip {} '*CTL*' -d "$target_dir" \;
説明する: -exec
{}
代替ファイル名が見つかった各ファイルに対して、次のコマンドが実行されます。コマンドはで終了する必要があります;
。シェルが独自のforの終了として解釈されるのを防ぐには、最後に\;
( '; 'エスケープ)を使用して代わりにプレーンテキストとして渡します。\
;
find
find
'*CTL*'
また、ファイルパターンが引数として渡されるときは、ファイルパターンを引用符で囲むのが最善です*CTL*
。これにより、シェルがファイル名を拡張する必要がなくなります。たとえば、この場合、zipファイルabcCTL.zip
の1つのファイル名にCTL(たとえば)が含まれているとします。*CTL*
パターンだけを使用すると、シェルはパターンを拡張してパターンを渡すのではなくunzip
ファイル名を渡しますが、abcCTL.zip
これは明らかに望ましくありません。