У мене є список каталогів у текстовому файлі, і кожен з них потрібно видалити. Як я можу прочитати в цьому списку команду ( 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{}тут роблять? Документи кажуть "замінити рядок". Також, чи працює це, якщо шляхи файлів зі списку видалення мають у них пробіли?