Яка різниця між знахідкою. і знайти. -друк


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 підтверджує це:

Якщо вираження немає, -принт використовується як вираз.

Так що find .рівнозначно find . -print; перший не має виразу, тому -printдодається внутрішньо.

Пояснення того, що -printвідбувається, зменшується на сторінці сторінки:

-print

Правда; надрукуйте повне ім’я файлу на стандартному виході, а потім новий рядок. Якщо ви збираєте висновок пошуку в іншій програмі і є найменша можливість, що файли, які ви шукаєте, можуть містити нову рядок, тоді вам варто серйозно розглянути можливість використання -print0опції замість -print. Дивіться розділ UNUSUAL FILENAMES для інформації про те, як обробляються незвичні символи у назви файлів.


Начебто питання початкового рівня, але про що це висловлювання? це регулярний вираз?
Ріші Пракаш


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предиката (або опції в першому випадку).

На жаль, це не є стандартним і не портативним.


Якщо воно нестандартне і найкраще уникати, навіщо його взагалі називати?
Ісаак

@Isaac, тому що вони можуть бути зручними / можливі друкарські помилки ...
vonbrand


4

У Linux немає різниці, але інші системи (наприклад, AIX) потребують, -printякщо ви хочете, щоб результат команди відображався на вашому екрані.


3
Це були б дуже дуже старі версії AIX тоді. AIX 4.3 findне потрібен. AIX підтримував POSIX протягом десятиліть.
Стефан Шазелас

3

Протягом багатьох років команда find не мала дії за замовчуванням. Поширеною помилкою було забуття додати параметр -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.