元のディレクトリから来て、特定のファイル名パターンを持つ複数の入力ファイルをインポートする必要があるコマンドがあります。たとえば、
ディレクトリに
/home/mydir/
私はファイルを持っています:
A.dat
B.dat
C.dat
readme.doc
「.dat」で終わるすべてのファイルをこのコマンドに渡す方法を知りたいです。これは次のとおりです。
command A.dat B.dat C.dat > /home/outputdir/output.dat
たとえば、ファイル名をリストに保存してPythonでこれを行うことができますが、シェルではどうすればよいですか?ありがとうございます。
答え1
標準のUNIXシェルは、次のことを行います。ワイルドカード;特殊文字(たとえば、1文字(?
)または任意の数の文字(*
))を使用して表されます。例を使用するには、次のようにします(最初の文字は$
入力したものではなくコマンドプロンプトを表します)。
$ command /home/mydir/*.dat > /home/outputdir/output.dat
シェルはそれを次に拡張します。
$ command /home/mydir/A.dat /home/mydir/B.dat /home/mydir/C.dat > /home/outputdir/output.dat
実際にコマンドを呼び出す前に。*
"/home/mydir から".dat" で終わるすべてのファイル名を取得します。
同じ入力ファイルが与えられた場合のコマンドのいくつかのバリエーションの場合:
# all of the sample input files have a single letter before the ".dat"
$ command /home/mydir/?.dat > /home/outputdir/output.dat
# the square brackets say "any (one) of these characters"
$ command /home/mydir/[ABC].dat > /home/outputdir/output.dat
答え2
答えは実際に使用したいツールによって異なります。一部は複数のファイルをパラメータとして受け入れるように設計されており、次のように実行できます。
/path/to/some/tool file1 /path/to/file2 /path/to/lotsafiles/*
他のものはファイルを引数としてのみ許可するように設計されているため、アドレスを指定したいファイルごとに呼び出しを繰り返す必要があります。これは次のようになります。
for file in file1 /path/to/file2 /path/to/lotsafiles/*; do
/path/to/some/tool "$file"
done
一度に1つのファイルのみを指定する必要があるかどうかを確認するには、プログラムのマニュアルページ(man tool
)を参照してください。