альтернативні варіанти rm -f


10

Я хотів би запустити командний рядок:

cd ~/www/tmp/; rm -P 2*

Але я отримую помилку, якщо немає файлів, починаючи з 2.

Ви думаєте, що я хотів би використати -f:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

І зробити турботу про фото permissions- , якщо є що - то дивне відбувається, я волів би команду переривання. Я хочу лише придушити помилки "не існувати".

Я переглянув деякі інші питання з "rm помилками" і виявив ці два, які здаються (начебто) актуальними:

Видаліть файли та каталоги за їх назвами. Немає такого файлу чи каталогу

Але я не розумію все, що відбувається у відповідях на це питання, і не знаю, що мені це потрібно?

touchХак запропонував в цьому питанні:

Rm не повідомив про відсутність файлу?

Здається, це є працездатним, тому що я не думаю, що я заперечую над хітом виконання (але який тип хіта ви будете брати? - тобто: це досить масштабована методика чи я просто навчусь дуже шкідливим звичкам?)

Я не впевнений, як би це зробив if-thenу командному рядку.

Чи існують інші варіанти простого очищення командного рядка "cut-n-paste"?

Було б find -deleteкраще для моєї справи? Якщо так, то чому?


помилка, про яку йдеться:

rm: 2*: No such file or directory

1
Помилка пов'язана з вашою оболонкою, а не rm, тому вам потрібно буде сказати, що це таке.
Майкл Гомер

Ви використовуєте zshяк свою інтерактивну оболонку? Ви отримуєте No matches foundпомилку?
Kusalananda

2
@MichaelHomer Ні, помилка від rm. Оболонка просто передала рядок 2*в rm, а не розширювала її до списку файлів. Подивіться на питання про помилку: там сказано, що РМ скаржиться, а не ш / bas / zsh / ...
doneal24

Відповіді:


13

Щоб зателефонувати лише rm -Pдля існуючих регулярних файлів, імена яких відповідають шаблону в каталозі (але не нижче):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Наприклад,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Щоб відповідати лише недиректоріям, використовуйте ! -type dзамість -type f. Різниця полягає в тому, що ! -type dбуло б справедливо для більш широкого спектру типів файлів (символічні посилання, названі труби, розетки тощо)

Оскільки вам потрібно запропонувати деякі умови у знайдених файлах, ви не повинні використовувати -deleteзамість того, -exec rmщо це працює як rm -f.

Видалити, -maxdepth 1щоб дозволити findрекурсивно шукати підкаталоги.


3
Хоча ! -type dможе бути ближче до rm 2*, по- моєму?
муру

Отже, мені доведеться додати -P, щоб отримати цю функціональність ?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082

@ user3082 Так, я забув, що ви також хотіли використовувати -P.
Кусалаланда

Дякую @muru, я насправді хочу -type f, але не знав, як зробити rmтак, - так пропозиція @ Кусаланади виявилася на місці, і розрізнення / пояснення чудово підходить для навчання.
user3082

@ user3082 вам, мабуть, доведеться використовувати розширений глобус вашої оболонки (наприклад, rm 2*(.)в zsh).
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.