web-dev-qa-db-ja.com

検索からファイルのリストを除外する

findを実行するときに除外したいテキストファイルにファイル名のリストがある場合、どうすればよいですか?たとえば、私は次のようなことをしたいです:

find /dir -name "*.gz" -exclude_from skip_files

skip_filesにリストされているファイルを除く/ dirのすべての.gzファイルを取得します。ただし、findには-exclude_fromフラグがありません。 skip_filesのすべてのファイルをスキップするにはどうすればよいですか?

33
Thomas Johnson

findにこのようなオプションがあるとは思わない。printfと除外リストを使用してコマンドを作成できます。

find /dir -name "*.gz" $(printf "! -name %s " $(cat skip_files))

これは以下と同じです:

find /dir -name "*.gz" ! -name first_skip ! -name second_skip .... etc

または、findからgrepにパイプすることもできます。

find /dir -name "*.gz" | grep -vFf skip_files
46
Josh Jolly

これは通常、結果からいくつかのファイルを削除するために行います(この場合、すべてのテキストファイルを探しましたが、ここにあるvalgrind memcheckレポートの束には興味がありませんでした):

find . -type f -name '*.txt' ! -name '*mem*.txt'

動作しているようです。

12
Martin G

試してみたいと思う

find /dir \( -name "*.gz" ! -name skip_file1 ! -name skip_file2 ...so on \)
8
Jayesh Bhoi
find /var/www/test/ -type f \( -iname "*.*" ! -iname  "*.php" ! -iname "*.jpg" ! -iname "*.png"  \)

上記のコマンドは、拡張子が.php、.jpg、.pngのファイルを除くすべてのファイルのリストを表示します。このコマンドはPuTTYで機能します。

2
Sohel Pathan

Josh Jollyのgrepソリューションは機能しますが、O(N ** 2)の複雑さがあるため、長いリストには遅すぎます。リストが最初にソートされる場合(O(N * log(N))複雑度)、O(N)複雑度を持つcommを使用できます。

find /dir -name '*.gz' |sort >everything_sorted
sort skip_files >skip_files_sorted
comm -23 everything_sorted skip_files_sorted | xargs . . . etc

man詳細については、コンピューターのcomm

0
Eric Toombs