Bulmak arasındaki fark nedir. ve bul . -print


27

Arasındaki fark nedir:

find .

ve

find . -print

-printAslında ne yapar ?

$ 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

Yanıtlar:


41

Gönderen findutils findman :

İfade verilmezse, ifade -printkullanılır (ancak -print0yine de kullanmayı düşünmelisiniz ).

( -printbir findifadedir.)

POSIX belgelerine bunu teyit ediyor:

Eğer ifade yoksa, ifade olarak -print kullanılır.

Yani find .tam olarak eşdeğerdir find . -print; İlki hiçbir ifadeye sahip olmadığı için -printdahili olarak eklenir.

-printManpage’de neler olacağının açıklaması :

-print

Doğru; Tam dosya adını standart çıktıya yazdıktan sonra yeni satır ekleyin. Bulunucunun çıktısını başka bir programa aktarıyorsanız ve aradığınız dosyaların yeni bir satır içerebilmesi için en ufak bir olasılık varsa, -print0bunun yerine seçeneği kullanmayı düşünmelisiniz -print. Dosya adlarındaki olağandışı karakterlerin nasıl işlendiğiyle ilgili bilgi için UNUSUAL FILENAMES bölümüne bakın.


Başlangıç ​​seviyesindeki soru türünden bir soru ancak konuştuğunuz ifade nedir? Bu normal ifade mi?
Rishi Prakash

2
@Rishi manpage bakın .
Stephen Kitt

20

-printvarsayılan eylemdir . Bazı findtahminler, filtrelere veya koşullara karşılık eylemler olarak kabul edilir . Örneğin, bir eylem değil. bir durum olarak da kullanılabilmesine rağmen bir eylemdir.-type f-exec

İşlemler şunlardır -print, -execve -ok. Bazı finduygulamalar gibi diğer standart dışı eylem yüklemler'ıN var -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Hiçbiri Nerede <some-predicates>ihtiva eylemleri eşdeğer şudur:

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

(Bazı -ooperatörler varsa yukarıdaki önemli parantezleri not edin ).

Şüphe duyduğunuzda , en iyi sonucu kullanmak -print(veya -exec printf '%s\0' {} +(veya mümkün -print0olduğu yerlerde) çıktının işlenebilmesi için) kullanmak en iyisidir .

Varsayılan -printişlem POSIX tarafından belirlenir. Bazı eski finduygulamalar açık bir gereksinim duyuyordu-print , ancak bunlar günümüzde genellikle vahşi doğada bulunmuyor.

Ayrıca, bazı finduygulamaların files, bu durumda geçerli dizinde arama yapmak için varsayılanları atlamasına izin verdiğini de unutmayın . Bu, onlar için

find

eşittir

find .
find . -print

Ancak bu standart değildir, bundan kaçınılmalıdır.

Spektrumun daha ayrıntılı (ve kullanışlı) ucunda, bazı finduygulamalar dosya yollarını argüman olarak aşağıdaki gibi bir -fseçeneğe geçirmeyi de sağlar :

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

Bunlar findkeyfi dosya yollarının iletilmesine izin veren tek uygulamalardır find. Diğer uygulamalar !veya gibi dosya yollarını kabul edemez, -printyani find "$file" -print(veya hatta find -- "$file" -print) varsayımın (veya ilk durumda seçenek) $fileadı olmadığını varsayar find.

Maalesef bu da standart ya da taşınabilir değil.


Standart değilse ve en iyi şekilde kaçınılması durumunda, neden isim veriyorsunuz?
Isaac,

@Iacac, çünkü kullanışlı olabilirler / muhtemel yazım hataları vardır ...
vonbrand 28:18


4

Linux'ta fark yoktur, ancak -printekranda görüntülenen komutun çıktısını almak istiyorsanız diğer sistemlerin (örneğin AIX gibi) ihtiyacı vardır .


3
O zamanlar AIX'in çok eski sürümleri olurdu. AIX 4.3 findbuna ihtiyaç duymuyor. AIX, onlarca yıldır POSIX uyumlu olmuştur.
Stéphane Chazelas

3

Yıllarca find komutunun varsayılan bir eylemi yoktu. Yaygın bir hata, find komutunuza -print seçeneğini eklemeyi unutmaktı. Hala bu güne alışkanlık bırakıyorum.

Fakat bir noktada, şu an için varsayılan eylem olarak eklenmiş find .ve find . -printeşdeğerdir.


1

-printDosya adı o eylem gerçekleştirilirken görüntülendiğinde başka bir işlem gerçekleştirirken açıkça kullanılması yararlı olabilir .

find . -print -delete

benzer olurdu

rm -rfv *

burada -printkarşılık için -v. Eğer -printeklemezseniz, dosya isimleri gösterilmez.

Bu rmkomutu daha da benzer yapmak için , bu arada, önce bu Bash komutunu verin.

shopt -s dotglob

hangi *maç nokta yapacak (gizli) dosyaları.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.