Apa perbedaan antara menemukan. dan menemukan . -mencetak


27

Apa perbedaan antara:

find .

dan

find . -print

Apa yang -printsebenarnya dilakukan?

$ 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

Jawaban:


41

Dari halaman findutils findmanual :

Jika tidak ada ekspresi yang diberikan, ekspresi -printitu digunakan (tetapi Anda mungkin harus mempertimbangkan untuk menggunakannya -print0sebagai gantinya).

( -printadalah sebuah findekspresi.)

The dokumentasi POSIX menegaskan hal ini:

Jika tidak ada ekspresi , -cetak akan digunakan sebagai ekspresi.

Jadi find .persis sama dengan find . -print; yang pertama tidak memiliki ekspresi sehingga -printditambahkan secara internal.

Penjelasan tentang apa yang -printmuncul lebih jauh di halaman manual:

-print

Benar; cetak nama file lengkap pada output standar, diikuti oleh baris baru. Jika Anda mem-pipkan output find ke program lain dan ada kemungkinan samar bahwa file yang Anda cari mungkin mengandung baris baru, maka Anda sebaiknya mempertimbangkan dengan serius menggunakan -print0opsi ini -print. Lihat bagian FILENAMEN TIDAK Biasa untuk informasi tentang bagaimana karakter yang tidak biasa dalam nama file ditangani.


Semacam pertanyaan tingkat pemula tetapi apa ungkapan yang Anda bicarakan ini? Apakah ini ungkapan reguler?
Rishi Prakash

2
@Rishi melihat halaman manual .
Stephen Kitt

20

-printadalah tindakan default . Beberapa findpredikat dianggap sebagai tindakan yang bertentangan dengan filter atau ketentuan . Misalnya, -type fbukan tindakan. -execadalah suatu tindakan meskipun juga dapat digunakan sebagai suatu kondisi.

Tindakan termasuk -print, -execdan -ok. Beberapa findimplementasi memiliki predikat tindakan non-standar lainnya seperti -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Di mana tidak ada tindakan yang<some-predicates> mengandung setara dengan:

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

(perhatikan tanda kurung di atas yang penting jika ada beberapa -ooperator).

Jika ragu, yang terbaik adalah menggunakan -printsecara eksplisit (atau -exec printf '%s\0' {} +(atau -print0jika tersedia) sehingga output dapat diproses setelahnya).

Tindakan default -printditentukan oleh POSIX. Beberapa findimplementasi lama memerlukan eksplisit-print , tetapi biasanya tidak ditemukan di alam liar saat ini.

Perhatikan juga bahwa beberapa findimplementasi mengizinkan penghapusan files, dalam hal ini mereka default untuk mencari ke direktori saat ini. Itu untuk mereka,

find

setara dengan

find .
find . -print

Namun itu bukan standar, jadi sebaiknya dihindari.

Di ujung spektrum yang lebih bertele-tele (dan bermanfaat), beberapa findimplementasi juga memungkinkan lewat jalur file sebagai argumen ke -fopsi seperti pada:

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

Mereka adalah satu-satunya findimplementasi yang memungkinkan lewat jalur file sewenang-wenang find. Implementasi lain tidak dapat menerima jalur file seperti !atau -print... jadi find "$file" -print(atau bahkan find -- "$file" -print) mengasumsikan $filebukan nama findpredikat (atau opsi dalam kasus pertama).

Sayangnya itu bukan standar atau portabel juga.


Jika tidak standar dan sebaiknya dihindari mengapa beri nama sama sekali?
Isaac

@ Isaac, karena mereka bisa berguna / mungkin salah ketik ...
vonbrand

8

Mereka sama, mereka berdua menulis seluruh hierarki direktori dari direktori saat ini.

Dari dokumentasi menemukan POSIX :

Perintah-perintah berikut ini setara:

temukan.

temukan. -mencetak


4

Di Linux tidak ada perbedaan, tetapi sistem lain (seperti AIX misalnya) perlu -printjika Anda ingin output dari perintah ditampilkan di layar Anda.


3
Itu akan menjadi versi AIX yang sangat lama. AIX 4.3 findtidak membutuhkannya. AIX telah sesuai POSIX selama beberapa dekade.
Stéphane Chazelas

3

Selama bertahun-tahun perintah find tidak memiliki tindakan default. Kesalahan umum lupa menambahkan opsi -print ke perintah find Anda. Saya masih sampai hari ini mengetiknya karena kebiasaan.

Tetapi pada beberapa titik itu ditambahkan sebagai tindakan default jadi sekarang find .dan find . -printsetara.


1

Kadang-kadang berguna untuk digunakan -printsecara eksplisit ketika Anda melakukan tindakan lain sehingga nama file ditampilkan saat tindakan itu dilakukan.

find . -print -delete

akan mirip dengan

rm -rfv *

dimana -printsesuai dengan -v. Jika Anda tidak memasukkan -printmaka nama file tidak ditampilkan.

Untuk membuat rmperintah lebih mirip, by the way, keluarkan perintah Bash ini terlebih dahulu

shopt -s dotglob

yang akan membuat file *titik dot (tersembunyi).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.