Bash: найти файлы с пробелами в конце строк

Я ищу команду bash для поиска файлов с конечными пробелами в конце каждой строки. Меня не интересует удаление пробелов, а просто поиск файлов.


person ziiweb    schedule 26.06.2012    source источник
comment
Примечание. Хотя формулировка вопроса (на момент написания этой статьи) недвусмысленно требует поиска файлов с пробелами в конце каждой строки, необычность этого требования привела к некоторым ответам, в частности наибольшее количество голосов - поиск файлов с одной или несколькими строками с пробелами в конце.   -  person mklement0    schedule 27.03.2015
comment
sed -n '/ \+$/p' имя файла   -  person Luv33preet    schedule 11.03.2017


Ответы (8)


Найдите файлы с пробелами в конце.

find . -type f -exec egrep -l " +$" {} \;
person pizza    schedule 26.06.2012
comment
Хотя вы можете обойтись только grep, как показали другие ответы, использование find все же может быть хорошей идеей, если вы хотите больше контролировать, какие файлы проверять. Вы можете сделать команду find намного более эффективной, используя + вместо \;, чтобы завершить первичный -exec - это вызовет egrep (обычно) только один раз с всеми именами файлов. - person mklement0; 27.03.2015
comment
Обратите внимание, что этот ответ находит файлы с по крайней мере 1 строкой с пробелами в конце. Это определенно может быть полезно и, вероятно, является более распространенным вариантом использования, но это не то, о чем просил ОП (по крайней мере, как следует из их формулировки, в конце строки каждой). - person mklement0; 27.03.2015

Если цель состоит в том, чтобы перечислить файлы, которые имеют конечные пробелы в одной или нескольких строках:

grep -r '[[:blank:]]$' .

Чтобы не печатать строки, а печатать только имена файлов, также укажите параметр -l. Это l в слове list, а не число 1.

person Acumenus    schedule 27.03.2015
comment
вопрос стоит в конце каждой строки - person Sorin; 27.03.2015
comment
@Sorin Я предполагаю, что это не совсем было целью ОП, но признаю, что вопрос действительно говорит об этом, если понимать буквально ... - person twalberg; 27.03.2015
comment
@twalberg, это то, что делает этот вопрос нетривиальным, он стоил бы третьего почти идентичного ответа. - person Sorin; 27.03.2015
comment
@Sorin В этом случае, возможно, сработает grep -rL '[^[:blank]]$' ... Ищет файлы, в которых есть строка, в которой символ, непосредственно предшествующий новой строке, не является пробелом, и сообщает обо всех файлах, которые не соответствуют этому шаблону. ... - person twalberg; 27.03.2015
comment
@twalberg, конечно, это сработает, но это не предмет обсуждения;) - person Sorin; 27.03.2015
comment
Вопрос ОП, если его понимать буквально, не имеет абсолютно никакой применимости в реальном мире, о котором я знаю. ИМХО, его следует отредактировать, чтобы отразить общий вариант использования, а также ответ, получивший наибольшее количество голосов. В конце концов, вопрос в том, что это также лучший результат Google для grep trailing whitespace. Есть возражения против редактирования вопроса как такового? - person Acumenus; 28.03.2015

Найдите файлы с одним или несколькими символами пробела в конце:

find . -name "*" | xargs egrep ".* +$"
person matcheek    schedule 26.06.2012
comment
Я полагаю, что первоначальный вопрос заключался в том, чтобы найти файлы, в которых есть конечные пробелы во ВСЕХ строках. Хотя, возможно, это была просто неудачная формулировка изначально. - person Etheryte; 26.06.2012
comment
@Nit, это ясно сказано в теле, должно быть, пропустил это, но заголовок вопроса может быть двусмысленным. - person matcheek; 26.06.2012
comment
Однако, расширяя ваше решение, egrep -m1 -v -l ".* +$" должен найти все файлы, которые не имеют конечные пробелы в каждой строке, если я не ошибаюсь? - person Etheryte; 26.06.2012
comment
Если первое всегда верно, то LIST=find * | xargs egrep -m1 -v -l .* +$ | xargs -I {} echo {};echo -e "$LIST""\n""find *" должен перечислить все файлы, которые не соответствуют критериям, дважды, а файлы, которые мы хотим перечислить, только один раз. Однако, похоже, я где-то сломал трубу, поэтому я не могу использовать uniq в результате. Любые идеи? - person Etheryte; 26.06.2012
comment
более простое регулярное выражение: ' $' или включить вкладки и пробелы: '[[:blank:]]$' - person Dennis Williamson; 26.06.2012
comment
Вызывает различные предупреждения egrep: (path): Is a directory. Обязательно укажите -type f для передачи только имен файлов в grep. - person Timo Tijhof; 18.06.2013

Существует возможность перечислить файлы, которые нигде не содержат совпадений; используйте это и регулярное выражение для символа, отличного от пробела, непосредственно перед концом строки.

grep -L '[^ ]$' *

Для рекурсии каталогов добавьте -r. Для поиска других пробельных символов также используйте класс символов $'[^ \t]$' или POSIX '[^[:blank:]]$' для регулярного выражения.

person tripleee    schedule 27.03.2015
comment
Хорошо сделано. Это действительно возвращает только файлы, ВСЕ строки которых имеют конечные пробелы - с одним исключением: также сопоставляются пустые (нулевые) файлы. Кроме того, использование * (без -r) приведет к появлению предупреждений для подкаталогов, если таковые имеются. -L не совместим с POSIX, но широко поддерживается, учитывая, что GNU grep и BSD sed реализуют его. - person mklement0; 28.03.2015
comment
@mklement0 mklement0 Хороший улов о файлах нулевого размера. Вы можете использовать -s, чтобы подавить предупреждения о каталогах, или использовать -r ., если вы хотите просмотреть все дерево каталогов (OP не говорил конкретно о задаче). - person tripleee; 28.03.2015

Используя ack (или ag):

ack -l ' \n'

Примечание. Как и в некоторых других ответах, здесь будут перечислены файлы, содержащие одну или несколько строк с пробелами в конце.

person friederbluemle    schedule 29.03.2015

Если целью является список файлов с конечным пробелом в текущем пути:

grep -rli '[[:blank:]]$' .
person class    schedule 08.01.2016

Если вопрос буквально в том, чтобы найти файлы, в которых есть пробел в конце каждой строки, то это должно работать:

grep -rL '[^[:blank:]]$' .

-L указывает grep сообщать о каждом файле, который не соответствует шаблону, а шаблон ищет строки, в которых нет пробела непосредственно перед новой строкой.

person twalberg    schedule 27.03.2015

Попробуй это :

find . -type f -name "* "
person user10914363    schedule 14.01.2019
comment
это найдет файлы с пробелом в конце имени файла - person Kuzeko; 22.01.2019