compa> find . -type d
.
./2015_08_30
./2015_08_25
./2015_08_27
./2015_08_31
./2015_08_24
./2015_08_26


compa> find . -type d -print
.
./2015_08_30
./2015_08_25
./2015_08_27
./2015_08_31
./2015_08_24
./2015_08_26

q1) Я не вижу никакой разницы с или без -принта. Почему тогда мы используем -print?

================= Далее я хочу увидеть папку 2015_08_31 для исключения.

compa> find . -name "2015_08_31"
./2015_08_31
compa> find . -name "2015_08_31" -prune
./2015_08_31

Только если я положу -o-отпечаток за черносливом, тогда он будет работать

find . -name "2015_08_31" -prune -o -print

q2) почему? Что на самом деле -o? Я верю, что это "или"?

Снова добавив -o -name снова все изменим.

compa> find . -name "2015_08_31" -prune -o -name "2015_08_30"
./2015_08_30
./2015_08_31

q3) Почему это показывает 08_30 и 08_31, когда я должен указать, чтобы сократить "2015_08_31"?

2 ответа2

0

Действие по умолчанию для find - это печать, поэтому в начальном примере вы не видите никакой разницы с командой печати или без нее.

Я должен признать, что я никогда не использовал -prune но, читая справочную страницу, похоже, она не делает то, что, как вы думаете, она делает.

правда истинная; если файл является каталогом, не спускайтесь в него.

Это означает, что при обнаружении совпадения, в данном случае на "2015_08_31", функция find не попадет в каталог, чтобы продолжить поиск файлов. Так как каталог верхнего уровня совпадает, и он find ему не нужно спускаться в него, он все равно будет выполнять над ним действия.

Все последующие примеры, по-видимому, проистекают из этого неправильного понимания того, что делает -prune , или как на самом деле работает find .

Если вы хотите find чтобы просто не распечатать этот каталог, попробуйте

find . -type d ! -name "2015_08_31"

В этой команде find выведет имена всех каталогов, указанных в. кроме "2015_08_31". Однако эта команда выведет все подкаталоги в разделе "2015_08_31".

Если вы хотите, чтобы find не показывал ничего общего с этим каталогом, вы можете попробовать

find . -type d ! -regex "./2015_08_31.*"
0

q1) Я не вижу никакой разницы с или без -принта. Почему тогда мы используем -print?

-print является действием по умолчанию, другие действия не указаны. Со страницы руководства:

   If the expression contains no actions other than -prune, -print is per‐
   formed on all files for which the expression is true.

q2) почему? Что на самом деле -o? Я верю, что это "или"?

Со страницы руководства:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

q3) Почему это показывает 08_30 и 08_31, когда я должен указать, чтобы сократить "2015_08_31"?

Действие -prune остановит find в этих каталогах, но не исключит их из вывода. Рассмотрим следующую структуру файлов:

.
./2015_08_31
./2015_08_30
./2015_08_30/test_dir
./2015_08_30/test_dir/test_file_1
./2015_08_30/test_dir/test_file_3
./2015_08_30/test_dir/test_file_2

Бег:

find . -name "2015_08_31" -prune -o -name "2015_08_30"

Покажет:

./2015_08_31
./2015_08_30

То есть find не спускается в каталоги prune d.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .