Удалить все файлы, которые соответствуют имени в списке

2

У меня есть папка с большим количеством изображений.

Мой клиент отправил мне список отклоненных изображений, которые мне нужно удалить из этой папки.

Список выглядит так: _001,_002,_003,_004,_006,_007,RAM08953,RAM08995,RAM08996,RAM09039,RAM09060,RAM09087,RAM09101,RAM09104,RAM09115,RAM09126,RAM09170,RAM09171,RAM09172,RAM09176,RAM09188.

Как я могу легко запустить что-то, что удаляет эти файлы, или переместить эти файлы в новую папку или что-то, не делая вручную? Это может быть приложение, сценарий оболочки или любой совет.

Руи Ганга
источник

Ответы:

0

Вы можете удалить список имен файлов, разделенных запятыми, используя CSV, используя следующую команду:

for file in $( cat foo.csv | awk '{gsub(",","\n"); print $0}' ); do rm $file; done

Вы можете сделать его более безопасным, переместив файл в корзину вместо того, чтобы удалить его:

for file in $( cat foo.csv | awk '{gsub(",","\n"); print $0}' ); do mv $file ~/.Trash; done

Как это работает

Это цикл FOR / DO, который сначала берет содержимое foo.csvи

  • cat foo.csv | Это выводит все содержимое файла CSV и передает его следующей команде
  • awk '{gsub(",","\n"); print $0} Эта строка принимает выходные данные предыдущей команды и, используя awkутилиту обработки текста, заменяет запятую ( ,) на символ новой строки ( \n). Затем выводит каждый элемент ( print $0) в отдельной строке
  • каждая строка становится «элементом» для цикла FOR для итерации.
  • для каждого элемента он выдаст команду rm $file
  • Вы можете удалить / переместить / переименовать / любой другой файл, изменив команду после do. (Например, do mv $file ~/Foo/Bar/$fileчтобы переместить его в другую папку.)
Аллан
источник
Излишнее использование catand |as awkбудет считывать файл в качестве аргумента , то "$(awk '{gsub(/,/, "\n")}1' foo.csv)"есть все, что требуется.
user3439894
@ user3439894 - Ладно ... твой короче и эффективнее, но мне нравится мой метод, потому что я не использую, awkно один раз в голубой луне, и он течет с моим стилем кодирования. В этом нет ничего «ненужного».
Аллан
Вы сказали: « В этом нет ничего« ​​ненужного ». Что ж , использование ненужной внешней команды и канала, когда это вообще не нужно, действительно не нужно! Я, конечно, не имею в виду ничего уничижительного в том, что я сказал, и, хотя вы не можете использовать awkэто часто, и, хотя моя awk команда более компактна, тем не менее, это не главное. Я только указываю на то, что обычно считается очень плохой парадигмой программирования. FWIW Я тоже использую, чтобы кодировать таким же плохим способом, но научился делать это лучше благодаря комментариям, подобным этим.
user3439894
Дело принято. Позвольте мне поделиться с вами одним из них ... Начало вашей «критики» со словом «ненужный» уничижительно.
Аллан
1

Чтобы удалить список разделенных запятыми имен файлов из папки, вы можете использовать следующее:

tr , '\n' <<< "file.jpg,second.jpg,…" | xargs -I{} rm /path/to/folder/{}

Замените file.jpg,second.jpg,…список файлов, разделенных запятыми.
Замените /path/to/folderпуть к папке с изображениями.

tr , '\n'заменяет запятые на входе новыми строками. xargsберет строки и запускает заданную команду для каждой строки, заменяя их {}вводом каждой строки (как указано в инструкции -I{}). trиспользуется, поскольку xargsв macOS не поддерживается -dпользовательский разделитель.

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

tr , '\n' <<< "file,second,…" | xargs -I{} rm /path/to/folder/{}.jpg
Grg
источник