використовувати rm для видалення файлів і каталогів рекурсивно


17

чи можна використовувати rm для видалення файлів і каталогів, що відповідають шаблону рекурсивно без використання інших команд?

Відповіді:


35

Щоб безпосередньо відповісти на ваше запитання, "ні - ви не можете робити те, що описуєте 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

1
правда - якщо ви вийдете з останньої труби, ви спочатку отримаєте список всього :)
warren

2
Може не відповісти безпосередньо на запитання афіші, але найближче вони дістаються до того, що хочуть.
Дракія

1
Гном, хіба що без причин трохи гірко?
Gnoupi

10
Будьте дуже обережні, використовуючи find | grep | xargs rm. Якщо є файли з пробілами (або новими рядками), це порушиться (і залежно від назви файлів та місця, де пробіли) може видалити речі, які ви не збиралися видаляти. find … -print0 | xargs -0 rmбуде набагато міцнішим. Це буде означати, однак, що ви не можете використовувати grepі повинні використовувати findпредикати, щоб відповідати та друкувати0 лише потрібні файли. Другий приклад Уоррена буде більш надійним як find -type f -name '*~' -print0 | xargs -0 rm.
Кріс Джонсен

1
Якщо ви хочете, щоб одна команда виконала цю роботу, зробіть псевдонім, використовуючи одну з поданих команд find. Залиште відповідь на це пізніше, за бажанням.
випадковий користувач

8

"без використання інших команд"

Ні.


Хороша відповідь, що ілюструє дискусію "суворо відповісти на початкове запитання (ризикуючи не в змозі надати рішення)" проти "запропонувати рішення, навіть якщо воно не суворо відповідає встановленим обмеженням".
Gnoupi

Я лише розмістив це, коли "Гном" скаржився на відповідь, яка насправді давала рішення. Без використання інших команд насправді немає можливості зробити рекурсивне видалення файлу, яке відповідає шаблону, просто видалення файлу з поточного каталогу / каталогу.
Дракія

3

Використовуючи 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командах.


0

Я б припустив "rm -rf", де поєднання назв файлів та відповідних шаблонів, таких як * і? тощо (наприклад, журнал todays_log_2009 ????.). Це почнеться від поточного Dir та рекурсивно видалить файли, які мають цей шаблон.


Це не спрацює, оскільки візерунок розширений оболонкою в поточному каталозі. Якщо цитується, шаблон стає іменем файлу із спеціальними символами. наприклад, щоб видалити файл [, можна було б написати rm '['. Візерунок просто втрачає своє значення.
випадковий користувач

0

Якщо ви використовуєте zsh (1) , увімкніть "розширений глобул" за допомогою setopt extendedglob.zshrc. Префіксація шаблону "** /" буде видалено рекурсивно:

% rm -rf ** / <шаблон>

Однак якщо є багато файлів для видалення, слід вдатися до пошуку (1) за допомогою xargs (1) або -exec, і я також рекомендую робити це в скриптах оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.