чи можна використовувати rm для видалення файлів і каталогів, що відповідають шаблону рекурсивно без використання інших команд?
чи можна використовувати rm для видалення файлів і каталогів, що відповідають шаблону рекурсивно без використання інших команд?
Відповіді:
Щоб безпосередньо відповісти на ваше запитання, "ні - ви не можете робити те, що описуєте rm".
Ви можете , однак, робити це, з яким ви поєднуєте find. Ось один із багатьох способів зробити це:
# search for everything in this tree, search for the file pattern, pipe to rm
find . | grep <pattern> | xargs rm
Наприклад, якщо ви хочете видалити всі файли * ~, ви можете так:
# the $ anchors the grep search to the last character on the line
find . -type f | grep '~'$ | xargs rm
Щоб перейти з коментаря * :
# this will handle spaces of funky characters in file names
find -type f -name '*~' -print0 | xargs -0 rm
find | grep | xargs rm. Якщо є файли з пробілами (або новими рядками), це порушиться (і залежно від назви файлів та місця, де пробіли) може видалити речі, які ви не збиралися видаляти. find … -print0 | xargs -0 rmбуде набагато міцнішим. Це буде означати, однак, що ви не можете використовувати grepі повинні використовувати findпредикати, щоб відповідати та друкувати0 лише потрібні файли. Другий приклад Уоррена буде більш надійним як find -type f -name '*~' -print0 | xargs -0 rm.
"без використання інших команд"
Ні.
Використовуючи Bash, з globstarнабором, так :
rm basedir/**/my*pattern*
Спробуйте, наприклад, ls -1спочатку, перш ніж rmперерахувати файли, які відповідають вам.
Ви можете встановити параметри , наприклад , через shopt -s globstar.
Як findваріант - коротший варіант:
find -type f -name 'my*pattern*' -delete
або для GNU find:
find -type f -name 'my*pattern*' -exec rm {} +
або інша альтернатива для не-GNU find(трохи повільніше):
find -type f -name 'my*pattern*' -exec rm {} \;
Щоб також видалити каталоги, як ви просите: тільки зміни rmв rm -rв наведених вище команд і пропустити узгодження на тільки -type fв findкомандах.
Я б припустив "rm -rf", де поєднання назв файлів та відповідних шаблонів, таких як * і? тощо (наприклад, журнал todays_log_2009 ????.). Це почнеться від поточного Dir та рекурсивно видалить файли, які мають цей шаблон.
Якщо ви використовуєте zsh (1) , увімкніть "розширений глобул" за допомогою setopt extendedglob.zshrc. Префіксація шаблону "** /" буде видалено рекурсивно:
% rm -rf ** / <шаблон>
Однак якщо є багато файлів для видалення, слід вдатися до пошуку (1) за допомогою xargs (1) або -exec, і я також рекомендую робити це в скриптах оболонки.