Я пытаюсь подсчитать общие строки в файлах в каталоге. Для этого я пытаюсь использовать комбинацию find и wc. Однако, когда я запускаю find . -exec wc -l {}\;
, я получаю ошибку find: missing argument to -exec
. Я не вижу никаких очевидных проблем, каких-либо идей?find -exec не распознает аргумент
ответ
Вам просто нужно пространство между {}
и \;
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
И еще лучше, что POSIX утверждает, что использование '+' вместо '';'' (или '\;') работает более или менее так же, как и с использованием 'xargs'; 'find' группирует группу имен файлов вместе для запуска команды один раз для N имен файлов (где N не является контролируемой величиной, но зависит от максимальной длины списка аргументов и длины имен файлов). –
С версией 4.0 или более поздней версией из bash
, вам не нужна ваша find
команды на все:
shopt -s globstar
wc -l **/*
Там нет простого способа пропускать каталоги, которые, как указана Gui Rava, которую вы, возможно, захотите сделать, если вы не можете различать файлы и каталоги только по имени. Например, может быть, никогда не придется директориях .
их имени, в то время как все файлы имеют по крайней мере один добавочный номер:
wc -l **/*.*
Вы пропустили пробел: 'найти. -exec wc -l {} \; '(пробел перед' \; '). –
Я не умный человек – ragingSloth