чи можна використовувати 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, і я також рекомендую робити це в скриптах оболонки.