bash Удаление всех файлов из заданного списка

Дерево каталогов

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

  1. old_IFS=$IFS; IFS=$'\n'; for i in $( <files.txt ); do rm -rf $i; done; IFS=$old_IFS

Как она работает?

Предположим, есть дерево каталогов такого вида:

▾ home/
  ▾ user_name/
    ▸ Documents/
    ▸ Download/
    ▾ folder1/
      ▾ subfolder 1/   ← каталог для удаления
        File 1.txt
        File 2.md
      ▾ subfolder 2/
        File 1.txt     ← файл для удаления
        File 2.md
      files.txt        ← файл со списком удаляемого
    ▾ folder2/
      ▸ subfolder 1/
      ▾ subfolder 2/
        File 1.bmp
        File 2.jpg
        File 3.txt     ← файл для удаления
        File 4.md
      ▸ subfolder 3/

Находясь в каталоге /home/user_name/folder1/, в терминале выполняется та строчка.

Результат выполнения:

▾ home/
  ▾ user_name/
    ▸ Documents/
    ▸ Download/
    ▾ folder1/
      ▾ subfolder 2/
        File 2.md
      files.txt        ← файл со списком удаляемого
    ▾ folder2/
      ▸ subfolder 1/
      ▾ subfolder 2/
        File 1.bmp
        File 2.jpg
        File 4.md
      ▸ subfolder 3/

Содержимое файла /home/user_name/folder1/files.txt

/home/user_name/folder1/subfolder 1/
subfolder 2/File 1.txt
../folder2/subfolder 2/File 3.txt

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

Слэш в конце строки /home/user_name/folder1/subfolder 1/, нужен лишь для человека, чтобы обозначить каталог. Команде rm всё равно есть там слэш или нет.

Если вы боитесь последствий неправильного составления списка, тогда примените эту строку:

  1. old_IFS=$IFS; IFS=$'\n'; for i in $( <files.txt ); do rm -r $i; done; IFS=$old_IFS

В результате выполнения этой строки команда rm будет запрашивать подтверждения каждого своего действия.