Как выполнить команду по списку имен файлов в файле?

11

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

Памятник погибшим
источник
1
Смотрите FAQ 001 на Wiki Грега ...
jasonwryan

Ответы:

11

Если у вас есть один файл на строку, один из способов сделать это:

tr '\n' '\0' < list_of_files_to_be_deleted.txt | xargs -0 -r rm --

Список файлов задается в качестве входных данных для trкоманды, которая изменяет разделитель файлов с перевода строки на нулевой байт, и xargsкоманда считывает на входе файлы, разделенные нулевыми байтами, и запускает команду rm с файлами, добавленными в качестве аргументов.

Йонас Берлин
источник
1
Я бы также предложил использовать rm --вместо just rm, чтобы имена файлов, которые могут начинаться с тире, не рассматривались как rmпараметры.
Артём
Это не сработало, приятель ........ tr: дополнительный операнд monu.txt' Try tr --help 'для получения дополнительной информации. rm: отсутствует операнд Попробуйте `rm --help 'для получения дополнительной информации. ........ Это все, что я могу видеть
памятник
1
Возможно, вы пропустили <перед именем файла?
Йонас Берлин
Я также немного улучшил команду xargs - добавил - по предложению @artyom и добавил -r, чтобы убедиться, что он не запускает rm, если нет файлов для удаления.
Йонас Берлин
5

Приведенный выше ответ хорош тем, что он обрабатывает имена файлов с пробелами и "странными символами". Но самый простой способ, если имена файлов нормальные, это просто (предупреждение, башизм!):

rm $(< /the/file/with/names)

Для обычной оболочки:

rm `cat /the/file/with/names`
vonbrand
источник