bash Удаление всех файлов из заданного списка
Опубликовано 17 Март 2015 - 14:51 пользователем bivПонадобилось мне как-то удалить одинаковый набор файлов в разных каталогах, и я написал простую строчку на bash.
- 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
всё равно есть там слэш или нет.
Если вы боитесь последствий неправильного составления списка, тогда примените эту строку:
- old_IFS=$IFS; IFS=$'\n'; for i in $( <files.txt ); do rm -r $i; done; IFS=$old_IFS
В результате выполнения этой строки команда rm
будет запрашивать подтверждения каждого
своего действия.