Подтвердить что ты не робот

Исключить список файлов из find

Если у меня есть список имен файлов в текстовом файле, который я хочу исключить, когда я запускаю find, как я могу это сделать? Например, я хочу сделать что-то вроде:

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

и получить все .gz файлы в каталоге /dir, за исключением файлов, перечисленных в skip_files. Но find не имеет флага -exclude_from. Как я могу пропустить все файлы в skip_files?

4b9b3361

Ответ 1

Я не думаю, что 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

Ответ 2

Это то, что я обычно делаю, чтобы удалить некоторые файлы из результата (в этом случае я искал все текстовые файлы, но не интересовался кучей отчетов memcheck от valgrind, которые есть у нас здесь и там):

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

Кажется, это работает.

Ответ 3

Я думаю, вы можете попробовать

find /dir \( -name "*.gz" ! -name skip_file1 ! -name skip_file2 ...so on \)

Ответ 4

find /var/www/test/ -type f \( -iname "*.*" ! -iname  "*.php" ! -iname "*.jpg" ! -iname "*.png"  \)

Приведенная выше команда дает список всех файлов, исключая файлы с расширением .php,.jpg ang.png. Эта команда работает для меня в шпаклере.

Ответ 5

Решение Josh Jolly grep работает, но имеет сложность O (N ** 2), что делает его слишком медленным для длинных списков. Если списки сортируются первыми (сложность O (N * log (N))), вы можете использовать comm, который имеет сложность O (N):

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

man ваш компьютер comm для деталей.