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

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

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

Вот, например, что, по моему мнению, сработает:

найти . -type f | grep ).MOV | xargs rm

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

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

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

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

Это позволяет правильно найти файлы:

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

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

Любая помощь будет высоко оценена.

решение1


rm *\).MOV

решение2

Укажите, 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

решение3

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

find . -name "*).MOV" -exec rm {} \;

решение4

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

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

Введите «ls», и вы должны увидеть следующее:

файл 3 файл 4 файл1 файл2

Теперь выполните «ls *\ *», и вы должны увидеть все с пробелами внутри:

файл 3 файл 4

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

Надеюсь, это поможет!

Связанный контент