2つのディレクトリAとBがあります。各ディレクトリにはZipが含まれています。
これら2つのZipファイルのパスをテキストファイルに書き込むにはどうすればよいですか?
ディレクトリシステムの例:
FILES/ONE/one.Zip
FILES/TWO/two.Zip
そして、FILESディレクトリからコマンドを実行したい
find
コマンドを使用して、次の方法で出力をファイルに送信できます。
/tmp/FILES$ find . -name "*.Zip" -print > outfile.txt
現在のフォルダー(Zip
)内でFILES
で終わるすべてのファイルを検索し、パスを出力しますfind
コマンドの出力は、テキストファイルに送信されます。
outfile.txt
の内容は次のとおりです。
/tmp/FILES$ cat outfile.txt
./TWO/two.Zip
./ONE/one.Zip
find
フォルダーの上の1つのフォルダーでFILES
コマンドを実行する場合、フォルダーのFILES
部分も出力に含まれることに注意してください。
例えば検索出力がstdout
に送信されるとき
/tmp$ find FILES -name "*.Zip" -print
FILES/TWO/two.Zip
FILES/ONE/one.Zip
シンプルシェルグロビングはこれを実現できます。たとえば、与えられた
$ tree .
.
├── ONE
│ └── one.Zip
└── TWO
└── two.Zip
2 directories, 2 files
それから
$ printf '%s\n' */*.Zip
ONE/one.Zip
TWO/two.Zip
コマンドに> outfile
を追加して、出力をファイルにリダイレクトします。 ./
を付加して相対パスをより明確にする場合は、%s
を./%s
に変更します
$ printf './%s\n' */*.Zip > outfile
$ cat outfile
./ONE/one.Zip
./TWO/two.Zip
これを実行したい場合再帰的に、bash
シェルオプションを有効にしている場合、globstar
はそれをサポートします。
$ cd ..
$ shopt -s globstar
$ printf '%s\n' **/*.Zip
FILES/ONE/one.Zip
FILES/TWO/two.Zip
スクリプトでこれを使用している場合、おそらくnullglob
オプションも有効にして、一致するファイルが存在しない場合を適切に処理する必要があります。
または、regex
で実行できます
find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.Zip" > outfile.txt
出力は同じです:
./TWO/two.Zip
./ONE/one.Zip
問題は、サブフォルダー内のすべてのZipファイルと一致することです。ファイルを含むサブフォルダーを定義できる場合、次のことができます。
find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.Zip" > outfile.txt