2014-10-06 3 views
0

Я пытаюсь подсчитать общие строки в файлах в каталоге. Для этого я пытаюсь использовать комбинацию find и wc. Однако, когда я запускаю find . -exec wc -l {}\;, я получаю ошибку find: missing argument to -exec. Я не вижу никаких очевидных проблем, каких-либо идей?find -exec не распознает аргумент

+5

Вы пропустили пробел: 'найти. -exec wc -l {} \; '(пробел перед' \; '). –

+0

Я не умный человек – ragingSloth

ответ

4

Вам просто нужно пространство между {} и \;

find . -exec wc -l {} \; 

Обратите внимание, что если есть какие-либо подкаталоги из текущего местоположения, wc будет генерировать сообщение об ошибке для каждого из них, который выглядит примерно так:

wc: ./subdir: Is a directory 

чтобы избежать этой проблемы, вы можете сказать find, чтобы ограничить поиск файлов:

find . -type f -exec wc -l {} \; 

Другое примечание: хорошая идея с использованием опции -exec. Слишком много раз люди трубы команды вместе думать, чтобы получить тот же результат, например, здесь было бы:

find . -type f | xargs wc -l 

Проблема с командами трубопроводов таким образом, что он ломает, если какие-либо файлы, имеет пробелы в нем. Например, если имя файла было «a», wc получит «a», а затем «b» отдельно, и вы, очевидно, получите 2 сообщения об ошибках: a: no such file и b: no such file.

Если вы не знаете, что имена файлов в них никогда не имеют пробелов (или символов, не подлежащих печати), если вам нужно соединять команды вместе, вы должны сообщить все инструменты, которые вы соединяете вместе использовать символ NULL (\ 0) в качестве разделителя вместо пробела. Таким образом, предыдущая команда стала бы:

find . -type f -print0 | xargs -0 wc -l 
+0

И еще лучше, что POSIX утверждает, что использование '+' вместо '';'' (или '\;') работает более или менее так же, как и с использованием 'xargs'; 'find' группирует группу имен файлов вместе для запуска команды один раз для N имен файлов (где N не является контролируемой величиной, но зависит от максимальной длины списка аргументов и длины имен файлов). –

1

С версией 4.0 или более поздней версией из bash, вам не нужна ваша find команды на все:

не
shopt -s globstar 
wc -l **/* 

Там нет простого способа пропускать каталоги, которые, как указана Gui Rava, которую вы, возможно, захотите сделать, если вы не можете различать файлы и каталоги только по имени. Например, может быть, никогда не придется директориях . их имени, в то время как все файлы имеют по крайней мере один добавочный номер:

wc -l **/*.*