Тож наступна поведінка Unix знаходить мене дорого:
> touch foo
> touch bar
> ls
bar foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?
Як це має сенс?
Тож наступна поведінка Unix знаходить мене дорого:
> touch foo
> touch bar
> ls
bar foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?
Як це має сенс?
Відповіді:
Командний рядок пошуку складається з різних типів параметрів, які поєднуються для формування виразів.
find
Варіант -delete
цю дію.
Це означає, що він виконується для кожного відповідного файлу на даний момент.
Як перший варіант після контурів, всі файли відповідають ... ой!
Це небезпечно - але на сторінці людини принаймні є велике попередження :
Від man find
:
ACTIONS
-delete
Delete files; true if removal succeeded. If the removal failed, an
error message is issued. If -delete fails, find's exit status will
be nonzero (when it eventually exits). Use of -delete automatically
turns on the -depth option.
Warnings: Don't forget that the find command line is evaluated as an
expression, so putting -delete first will make find try to delete
everything below the starting points you specified. When testing a
find command line that you later intend to use with -delete, you
should explicitly specify -depth in order to avoid later surprises.
Because -delete implies -depth, you cannot usefully use -prune and
-delete together.
З подальшого опису в man find
:
EXPRESSIONS
The expression is made up of options (which affect overall operation rather
than the processing of a specific file, and always return true), tests
(which return a true or false value), and actions (which have side effects
and return a true or false value), all separated by operators. -and is
assumed where the operator is omitted.
If the expression contains no actions other than -prune, -print is per‐
formed on all files for which the expression is true.
Перевірте, що find
буде робити команда:
Щоб побачити, що таке команда
find . -name '*ar' -delete
буде видалено, ви можете спочатку замінити дію -delete
на більш нешкідливу дію - наприклад, -fls
або -print
:
find . -name '*ar' -print
Це дозволить надрукувати, на які файли впливає дія.
У цьому прикладі -принт можна залишити. В цьому випадку, не дія взагалі, тому найбільш очевидні додаються неявно: -print
. (Дивіться другий абзац розділу "ВРАЗИ", цитований вище)
-delete
прапор :-) Але чи є хтось причина, ніж хтось коли-небудь робити, find . -delete
а не rm -rf .
? Або це просто трапляється способом find
розбору та обробки аргументів?
warning: use -depth when testing stuff you later want to -delete
яку ви цитуєте, не говорить про те, що ви не зробили на своєму практичному прикладі?
-n
варіант; Перша команда, звичайно, взагалі не повинна мати практичного використання; Я піду поміняти.
У find
порядку аргументів має значення багато.
Аргументами можуть бути варіанти, тести та дії. Зазвичай слід спочатку використовувати параметри, потім тести, а потім дії.
Іноді find
навіть попереджає про можливе неправильне замовлення (наприклад, коли ви використовуєте -maxdepth
після інших аргументів), але іншим, здається, це не так.
Що find . -delete -name '*ar'
таке:
Можливо, ви хочете зробити це:
find -name '*ar' -delete
Це визначатиме, чи відповідає він кожному файлу, '*ar'
і лише якщо він задовольняє умові, він видалить файл.
Вибачте, якщо ви дізналися занадто пізно.