Исключить список файлов из find
Если у меня есть список имен файлов в текстовом файле, который я хочу исключить, когда я запускаю find
, как я могу это сделать? Например, я хочу сделать что-то вроде:
find /dir -name "*.gz" -exclude_from skip_files
и получить все .gz файлы в каталоге /dir, за исключением файлов, перечисленных в skip_files. Но find не имеет флага -exclude_from
. Как я могу пропустить все файлы в skip_files
?
Ответы
Ответ 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
для деталей.