3

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

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

находить . тип F | grep).MOV | XARGS RM

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

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

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

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

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

находить . тип F | grep).MOV

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

Любая помощь будет принята с благодарностью.

5 ответов5

5

rm *\).MOV
4

Скажите 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
1

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

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

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

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

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

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

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

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

0

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

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

Сделайте "ls", и вы должны увидеть это:

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

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

файл 3 файл 4

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .