альтернативные варианты для 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
user3082
источник
1
Ошибка от вашей оболочки, нет rm, поэтому вам нужно сказать, что это такое.
Майкл Гомер
Вы используете в zshкачестве интерактивной оболочки? Вы получаете No matches foundошибку?
Кусалананда
2
@MichaelHomer Нет, ошибка от rm. Оболочка просто передала строку 2*в rm вместо того, чтобы развернуть ее в список файлов. Посмотрите на вопрос об ошибке: он говорит, что rm жалуется, а не sh / 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себя вести себя так - поэтому предложение @ Kusalanada было точным, а дифференциация / объяснение отлично подходит для обучения.
user3082
@ user3082 вам, вероятно, придется использовать расширенную глобализацию вашей оболочки (например, rm 2*(.)в zsh).
Муру