В чем разница между находкой. и найти . -Распечатать


27

В чем разница между:

find .

а также

find . -print

Что на -printсамом деле делает?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

Ответы:


41

Из findutils findсправочной страницы :

Если выражение не задано, выражение -printиспользуется (но вам -print0все равно, вероятно, следует рассмотреть возможность его использования ).

( -printэто findвыражение.)

Документация POSIX подтверждает это:

Если выражение отсутствует, в качестве выражения следует использовать -print .

Так find .что в точности эквивалентно find . -print; первое не имеет выражения, поэтому -printдобавляется внутри.

Объяснение того, что -printпроисходит, приведено ниже на странице руководства:

-print

Правда; Напечатайте полное имя файла на стандартном выводе, за которым следует новая строка. Если вы передаете вывод команды find в другую программу и существует минимальная вероятность того, что файлы, которые вы ищете, могут содержать символ новой строки, тогда вам следует серьезно рассмотреть возможность использования -print0параметра вместо -print. Смотрите раздел НЕОБЫЧНЫЕ ФИЛЬМЫ для получения информации о том, как обрабатываются необычные символы в именах файлов.


Что-то вроде вопроса начального уровня, но о каком выражении вы говорите? это регулярное выражение?
Риши Пракаш


20

-printэто действие по умолчанию . Некоторые findпредикаты рассматриваются как действия, а не как фильтры или условия . Например, -type fэто не действие. -execэто действие, хотя оно также может быть использовано в качестве условия.

Действия включают в себя -print, -execи -ok. Некоторые findреализации имеют другие нестандартные предикаты действия , такие как -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Где ни одно из <some-predicates>содержащихся действий не эквивалентно:

find files \( <some-predicates> \) -print

(обратите внимание на круглые скобки, которые важны, если есть несколько -oоператоров).

В случае сомнений лучше всего использовать -printявно (или -exec printf '%s\0' {} +(или -print0там, где это возможно), чтобы выходные данные могли быть постобработаны).

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

Также обратите внимание, что некоторые findреализации позволяют опускать files, в этом случае они по умолчанию для поиска в текущем каталоге. То есть для них

find

эквивалентно

find .
find . -print

Это, однако, не является стандартным, поэтому лучше избегать.

На более подробном (и полезном) конце спектра некоторые findреализации также позволяют передавать пути к файлам в качестве аргумента для -fопции, как в:

find -f "$file1" -f "$file2" -print

Они являются единственными findреализациями, которые позволяют передавать произвольные пути к файлам find. Другие реализации не могут принимать пути к файлам, такие как !или -print... поэтому find "$file" -print(или даже find -- "$file" -print) предполагает, что $fileэто не имя findпредиката (или опция в первом случае).

К сожалению, это не стандартно и не портативно.


Если он нестандартный и его лучше избегать, зачем вообще его называть?
Исаак

@ Исаак, потому что они могут быть полезны / возможны опечатки ...
vonbrand

8

Они одинаковы, оба выписывают всю иерархию каталогов из текущего каталога.

Из POSIX найти документацию :

Следующие команды эквивалентны:

находить .

находить . -Распечатать


4

В Linux нет разницы, но другие системы (например, AIX) нужны, -printесли вы хотите, чтобы вывод команды отображался на вашем экране.


3
Это были бы очень и очень старые версии AIX. AIX 4.3 findне нуждается в этом. AIX была POSIX-совместимой на протяжении десятилетий.
Стефан Шазелас

3

В течение многих лет команда поиска не имела действия по умолчанию. Распространенной ошибкой было забыть добавить опцию -print в команду find. Я до сих пор набираю это по привычке.

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


1

Иногда полезно использовать -printявно, когда вы выполняете другое действие, чтобы имя файла отображалось при выполнении этого действия.

find . -print -delete

будет похоже на

rm -rfv *

где -printсоответствует -v. Если вы не включите, -printто имена файлов не отображаются.

rmКстати, чтобы сделать команду еще более похожей, сначала выполните эту команду Bash

shopt -s dotglob

который сделает *файлы совпадения точек (скрытые).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.