“Find: paths ifadeden önce gelmelidir:” Geçerli dizindeki dosyaları da içeren özyinelemeli bir aramayı nasıl belirtebilirim?


235

Geçerli dizinde olduğu gibi alt dizinlerinde de eşleşmeleri bulmakta zorlanıyorum .

Çalıştırdığımda find *test.csadece geçerli dizindeki eşleşmeleri verir. (alt dizinlere bakmaz)

Denersem find . -name *test.caynı sonuçları beklerdim, ama bunun yerine bana sadece bir alt dizindeki eşleşmeleri verir. Çalışma dizininde eşleşmesi gereken dosyalar olduğunda bana şunu verir:find: paths must precede expression: mytest.c

Bu hata ne anlama geliyor ve hem geçerli dizinden hem de alt dizinlerinden eşleşmeleri nasıl alabilirim?


4
kayıt için, findbir msysgit tırnak ile desen çevreleyen sürece bu hatayı atmak olabilir: find . -name "*test.c". (Windows 'dan farklı find.exeve
cmd'den

Yanıtlar:


393

Tırnak içine koymayı deneyin - kabuğun joker karakter genişlemesine koşuyorsunuz, bu yüzden bulmak için geçtiğiniz şey şuna benzer:

find . -name bobtest.c cattest.c snowtest.c

... sözdizimi hatasına neden oluyor. Bunun yerine şunu deneyin:

find . -name '*test.c'

Dosya ifadenizin etrafındaki tek tırnak işaretlerini not edin - bunlar kabuk (bash) joker karakterlerinizi genişletmeyi durdurur.


15
Örnek olarak, eğer yaparsanız ne olduğunu görebilirsiniz echo *test.c... sonuç joker karakteri genişletmek için yankı değil, kabuğun kendisidir. Basit ders, joker karakterler kullanıyorsanız, filespec'i belirtin :-)
Chris J

Bu VARIANT ile bana yardım ettiğin için teşekkürler. find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’Web'de bulunan gibi denedim ve "yolları ifade önce olmalıdır" ile karşılandı. Sorun teklif işaretleri çok "akıllı" idi. Komutu tekrar yazdım, tırnakların değiştirilmesine neden oldum ve çalıştı.
Smandoli

2
Nedense tek tırnaklar benim için işe yaramadı. Çift tırnak kullanmak zorunda kaldım. ¯ \ _ (ツ) _ / ¯
Planky

joker karakterli aramalar için tek tırnak Busybox ve GNU ile çalıştı find- bir joker karakter kullanıyorsanız *.$variableçift ​​tırnak gerekir.
Stuart Cardall

@Planky: Ben koydum: find, -name 'write.lock' kabuk script dosyasına ama bu hata mesajına sahip. Ama eğer konsola yazarsam çalışır. Nedenini bilen var mı?
Scott Chu

28

Olan şey, kabuğun "* test.c" dosyasını bir dosya listesine genişletmesidir. Yıldız işaretinden kaçmayı deneyin:

find . -name \*test.c

#gitbash, PATTERN'den alıntı yaparken bile pencerelerde git bash ile benim için bir çözümdüfind . -name '*txt'
farklı bir ben

17

Tırnak içine koymayı deneyin:

find . -name '*test.c'

13

El kitabını bul:

NON-BUGS         

   Operator precedence surprises
   The command find . -name afile -o -name bfile -print will never print
   afile because this is actually equivalent to find . -name afile -o \(
   -name bfile -a -print \).  Remember that the precedence of -a is
   higher than that of -o and when there is no operator specified
   between tests, -a is assumed.

   “paths must precede expression” error message
   $ find . -name *.c -print
   find: paths must precede expression
   Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]

   This happens because *.c has been expanded by the shell resulting in
   find actually receiving a command line like this:
   find . -name frcode.c locate.c word_io.c -print
   That command is of course not going to work.  Instead of doing things
   this way, you should enclose the pattern in quotes or escape the
   wildcard:
   $ find . -name '*.c' -print
   $ find . -name \*.c -print

0

@Chris J'nin cevabında açıklandığı gibi düzenli bir ifadede birleştiremediğim birden fazla dosya adı bulmaya çalışırken bu soruya rastladım, işte benim için çalıştı

find . -name one.pdf -o -name two.txt -o -name anotherone.jpg

-oveya -ormantıksal VEYA. Daha fazla bilgi için Gnu.org'da Dosya Bulma konusuna bakın .

Bunu CygWin'de çalıştırıyordum.


-1

Benim durumumda /yolun sonunu kaçırıyordum .

find /var/opt/gitlab/backups/ -name *.tar

1
Sondaki bir izlemeye /gerek yoktur.
melpomene
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.