У мене є список каталогів у текстовому файлі, і кожен з них потрібно видалити. Як я можу прочитати в цьому списку команду ( rm -r
або rmdir
)?
У мене є список каталогів у текстовому файлі, і кожен з них потрібно видалити. Як я можу прочитати в цьому списку команду ( rm -r
або rmdir
)?
Відповіді:
"Більш правильним" рішенням було б таке:
xargs -I{} rm -r {} < files
Це викликає rm -r
, де {}
замінюється ім'я файлу.
Чому? Передача файлів з пробілами xargs
призведе до помилкових аргументів. Скажімо, ваш список файлів виглядає приблизно так:
/path/to/file 1
/path/to/file_2
Потім xargs rm -r < list.txt
буде спробувати видалити /path/to/file
, 1
і /path/to/file_2
. Однозначно не те, що ти хочеш. Завжди бути в курсі пробілів у шляхах під час передачі з команд UNIX / Linux та до них.
< files
марка xargs
отримати список файлів в якості стандартного вводу. Потім він викликає початковий аргумент rm -r
у кожному отриманому рядку (= ім'я файлу). За допомогою -I
опції розбиття здійснюється на основі нових рядків, а не пробілів, а це означає, що ця операція безпечна для файлових шляхів із пробілами в них. Я не розумію вашого іншого коментаря.
cat files | tr '\n' '\0' | xargs -0 rm -r
- це замінює нові рядки ASCII нульовими символами. xargs
Потім зателефонує rm
за кожною з отриманих ліній окремо.
-I{}
тут роблять? Документи кажуть "замінити рядок". Також, чи працює це, якщо шляхи файлів зі списку видалення мають у них пробіли?