web-dev-qa-db-ja.com

ファイルパスを比較的取得する

2つのディレクトリAとBがあります。各ディレクトリにはZipが含まれています。

これら2つのZipファイルのパスをテキストファイルに書き込むにはどうすればよいですか?

ディレクトリシステムの例:

FILES/ONE/one.Zip
FILES/TWO/two.Zip

そして、FILESディレクトリからコマンドを実行したい

4
Krsztr

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
8
Yaron

シンプルシェルグロビングはこれを実現できます。たとえば、与えられた

$ 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オプションも有効にして、一致するファイルが存在しない場合を適切に処理する必要があります。

2
steeldriver

または、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
0
Petr