Как я удаляю все файлы, которые содержат определенную строку в каталоге в UNIX?

Я нашел несколько примеров, которые работают, пока нет никаких пробелов в именах файлов. К сожалению, у меня есть пробелы в моих именах файлов (не мой выбор, на самом деле они - те, я должен удалить).

Так, например, это - то, что я думал, будет работать:

найти. - тип f | grep).MOV | xargs комната

потому что я хочу удалить файлы как:

  • L112 (1).MOV
  • L113 (1).MOV
  • L113 (2).MOV
  • и т.д.

и я хочу сохранить файлы как

  • L112. MOV
  • L113. MOV
  • L114. MOV
  • и т.д.

Это находит файлы правильно:

найти. - тип f | grep).MOV

но когда я передаю его по каналу к комнате, пробелы в имени файла завинчивают его.

Любая справка значительно ценилась бы.

3
задан 26.08.2009, 22:19

5 ответов


rm *\).MOV
5
ответ дан 07.12.2019, 23:00

Сказать xargs использовать новые строки в качестве разделителей:

find . -type f | grep ).MOV | xargs -d'\n' rm

Лучше, иметь find сделайте соответствие и использование -print0 и xargs -0 позволить любой символ в именах файлов, даже \n!

find . -type f -name '*).MOV' -print0 | xargs -0 rm

Еще лучше просто имейте find звонить rm непосредственно.

find . -type f -name '*).MOV' -exec rm {} +

Лучше всего пропустить rm и имейте find сделайте удаление.

find . -type f -name '*).MOV' -delete

Или в этом конкретном случае, кому нужно все тяжелое машиностроение?

rm *\).MOV
4
ответ дан 07.12.2019, 23:00

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

find . -name "*).MOV" -exec rm {} \;
1
ответ дан 07.12.2019, 23:00

Много инструментов Unix хрупки (или по крайней мере хитры для использования правильно) в присутствии имен файлов, содержащих пробелы и вкладки или еще худшие, новые строки, поэтому когда у Вас есть выбор, необходимо избежать этих символов в именах файлов.

Однако, если Вы захотите удалить все файлы в текущем каталоге (и все подкаталоги) с пространством на имя, то следующее будет работать.

find . -name '* *' -print0 | xargs -0 rm -f 

-print0 опция говорит, находят для использования байта NUL (\0) в качестве разделителя между именами файлов вместо NL (\n). С другой стороны, -0 говорит xargs использовать NUL в качестве разделителя строки вместо NL. Измените аргумент шаблона к -name опция по мере необходимости для соответствия файлам Вы хотите удалить.

Это может быть немного хитро для предотвращения find от рекурсивного вызова в подкаталоги (хотя выезд -maxdepth аргумент), поэтому если Вы только хотите влиять на файлы в текущем каталоге, Вы могли бы хотеть приблизиться к проблеме по-другому.

В целом, я настоятельно рекомендую стать быстрым с find и xargs. Индивидуально, и особенно при объединении в цепочку вместе как показано выше они делают чрезвычайно гибкий инструментарий для объемных операций файла.

1
ответ дан 07.12.2019, 23:00

В большинстве установок Unix можно обозначить пространство в имени файла путем добавления префикса его обратную косую черту. Так, например, испытайте это:

mkdir blah
cd blah
touch file1
touch file2
touch "file 3"
touch "file 4"

Сделайте "ls", и необходимо видеть это:

файл 4 file1 file2 файла 3

Теперь сделайте "ls *\*", и необходимо видеть все с пространством в нем:

файл 4 файла 3

Таким образом, возможно, просто "комната *\*" является всем, в чем Вы нуждаетесь? Или измените то регулярное выражение немного для установки потребностям.

Надежда, которая помогает!

0
ответ дан 07.12.2019, 23:00

Теги

Похожие вопросы