2015-02-25 3 views
2

Попытка найти все файлы, которые исключены из list.txt с помощью следующих из командной строки/USR/бен/найти список аргументов слишком длинный

find . -type f -name "*.ext" $(printf "! -name %s " $(cat list.txt)) 

я получаю следующий результат

Я также пробовал с xargs, но не уверен, правильно ли я использую его. Любая помощь будет оценена по достоинству.

+1

Можете ли вы показать нам, что вы пробовали с помощью 'xargs'? – larsks

+0

Очевидным вопросом будет то, насколько велик ваш список - если вы отрубите только первые 10 строк, это сработает, или что-то не так с идеей как в концепции, так и в количестве? Кроме того, вы можете попробовать перед командной строкой с помощью 'echo' отсортировать вывод« что это может сделать ». –

+0

Список имеет более 1M строк – biggthed

ответ

2

Я бы труба, grep:

find -type f -name '*.ext' | grep -vFf list.txt 

При прохождении -f Grep читает шаблоны поиска из файла. -v отменяет поиск. Обычно grep рассматривает шаблоны поиска как регулярные выражения. Если вы -Fgrep будут обрабатывать их как фиксированные строки.

+0

Это имеет смысл, но я получил следующий вывод ------------------------- «grep: Непревзойденный [или [^» – biggthed

+0

Что делать, если вы попытаетесь 'найти ... | grep -vFf list.txt'? – hek2mgl

+0

Да! Это работает! -vFf помог справиться с пробелами, которые я предполагаю. Спасибо! – biggthed

0

Вы можете попробовать это?

найти. -type f -name "* .ext" -exec grep -v "^ {} $" list.txt & & echo {} \;

+0

получил следующее: find: missing аргумент '-exec ' – biggthed

0

Не совсем понятно, что вы намерены делать с вашей командой, поэтому эти замечания являются немного обобщенными.

Если вы хотите Grep большое количество файлов для слова foo, к примеру, тогда вы могли бы сделать что-то вроде

find . -type f -name \*.ext | xargs grep foo 

Важным моментом здесь является то, что \* передается find для него для расширения, и это не расширена оболочкой. Ошибка «Список аргументов слишком длинная», вероятно, является результатом оболочки , расширяя ваш "*.ext" и пытаясь передать этот длинный список в виде множества аргументов для поиска. Это может быть ключевым, что вам не хватает в ваших экспериментах.

Способ, которым работает xargs, заключается в том, что он считывает аргументы из stdin (в этом случае список файлов, созданных find), и повторно вызывает данную функцию с таким количеством аргументов, которое будет соответствовать. Если строки, отправленные на xargs, совершенно необычны, вы должны посмотреть опцию -0 для xargs.

Другой способ использования найти, что более естественно в некоторых обстоятельствах,

find . -type f <whatever> | while read f; do some-command $f; done 

Здесь while снова читает строки по одному, назначая их, в свою очередь f, которые обрабатываются один за другим время в цикле.

+0

Как это исключить файлы из list.txt? – biggthed

+0

@biggthed Ahhh, я _see_, что вы делаете с 'list.txt'! (doh: бит, на который я сосредоточился, был переполнением аргумента числа, которое может возникнуть из '' * .ext "'). Как я бы это сделал, это не создание большого списка аргументов для 'find', а' найти . -name \ *. ext | cat - list.txt | сортировать | uniq -u | ... '. 'Cat-list.txt' приводит к списку, в котором дублируются все файлы в' list.txt', которые должным образом удаляются 'uniq -u' –

Смежные вопросы