Herhangi bir yol belirtilmezse, bul neden önde gelen bir './' yazıyor?


13

Neden olduğunu finddışarı baskılar lider ./hiçbir yolları verilirse sonuçlarına?

$ find
./file1
./file2
./file3

Bunu yazdırmamanın nedeni nedir?

$ find
file1
file2
file3

Yanıtlar:


16

Nedeni GNU geliştiricisi çünkü bunu görüyor yüzden seçtik için "makul" bir davranış sağlamak için hiçbir yol verildiğinde. Buna karşılık POSIX , parametrenin isteğe bağlı olduğunu belirtmez:find find

Yardımcı findprogram, karşılaşılan her dosya için OPERANDS bölümünde açıklanan primerlerden oluşan bir Boole ifadesini değerlendirerek, yolla belirtilen her dosyadan dizin hiyerarşisini yinelemeli olarak indirecektir. Her yol işleneni, izleyen tüm <slash>karakterler de dahil olmak üzere, sağlandığı şekilde değiştirilmemiş olarak değerlendirilecektir ; hiyerarşide karşılaşılan diğer dosyalar için tüm yol adları , geçerli yol işleneninin birleştirilmesinden , geçerli yol işleneni <slash>biriyle bitmediyse ve yol işlenmesine göre dosya adından oluşur. Bağıl kısım nokta veya nokta-nokta bileşenleri içermemeli, arka kısım olmamalıdırkarakterleri ve <slash>yol adı bileşenleri arasında yalnızca tek karakterler.

Her biri için özetin farkını görebilirsiniz. GNU köşeli parantez içinde isteğe bağlı öğeler içerir:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
       [expression]

POSIX isteğe bağlı olabileceğini göstermez:

find [-H|-L] path... [operand_expression...]

GNU programında bu yapılır ftsfind.c:

  eğer (boş)
    {
      / *
       * Burada bazı değişkenler kullandığımız için geçici bir değişken kullanıyoruz
       * yolu geçici olarak. Dolayısıyla bir dize sabiti kullanırsak,
       * bir coredump alırız. Bunun en güzel örneği,
       * "find -printf% H" (not, "find. -printf% H" değil).
       * /
      char defaultpath [2] = ".";
      dönüş bulma (defaultpath);
    }

ve "."basitlik için bir değişmez değer kullanılır. Böylece aynı sonucu

find

ve

find .

çünkü (ve POSIX kabul eder) verilen yol sonuçların önekini yapmak için kullanılacaktır ( birleştirme için yukarıya bakınız ).

Küçük bir çalışma ile, özellik ilk ne zaman eklendiğini belirleyebilir; Bu mevcuttu 1996 yılında "findutils" ilk oluşturulması (bkz find.c):

+  /* If no paths are given, default to ".".  */
+  for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+    process_top_path (argv[i]);
+  if (i == 1)
+    process_top_path (".");
+
+  exit (exit_status);
+}

Bulmak için değişiklik günlüğünden, bu görünüşe göre

Sat Dec 15 19:01:12 1990  David J. MacKenzie  (djm at egypt)

        * find.c (main), util.c (usage): Make directory args optional,
        defaulting to "."

11

Genellikle, dosyalar sonradan işlenir ve bu durumda dosya adının başlatılması için büyük bir avantaj olabilir ./. Özellikle, bir dosya adı ile başlarsa -, sonraki komut bu dosya adını bir seçenek olarak yorumlayabilir. ./bundan kaçınır.

Örnek olarak, bu dosyaları içeren bir dizin düşünün:

$ ls
--link  --no-clobber

Şimdi, dosya adları ./önde olmadan sağlanmışsa bu komutun nasıl çalışacağını düşünün :

$ find -type f -exec cp -t ../ {} +

Sorunu findkendisiyle açıklayabiliriz. Yukarıdaki ile aynı dizinde çalıştıralım. Aşağıdaki işler:

$ find ./*
./--link
./--no-clobber

Aşağıdakiler başarısız olur:

$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.

1
Mantıklı. Ama sonra neden bir '.' koştuğunda find *.
nr

@nr İyi nokta. Bir tür tarihsel uyumluluk için böyle davranmasını bekliyorum. Cevaba neden bunun istenmeyen davranış olduğuna dair bir örnek ekledim.
John1024

3
Bazı sürümleri file talep kullanıcı (OS X üzerinde BSD find benzeri) bir yol vermek. Bu yüzden genellikle açıkça bir şey söylemeniz gerekir find . -type f .... Oradan, find (GNU find gibi) bazı sürümlerinin varsayılan olarak .diğer her şeyi olduğu gibi bırakmak ve bırakmak için büyük bir adım değildir .
ilkkachu

1
Nedeni find *gösterilmiyor .çünkü *tüm listelerin dosyaları ve klasörleri ama dışlar .. echo *Yalnızca bir veya iki dosya içeren bir dizinde yapın ve .listede bulunmadığını göreceksiniz . Böylece find *genişletilmiş her dosya üzerinde çalışır. find Desktop/Ana dizinden söylediklerinizle aynıdır . Çıkışı olarak göreceksinizDesktop/foo_bar.txt
Sergiy Kolodyazhnyy

1
@ John1024: Mrigesh ve Thomas Dickey'nin soruyu doğru cevapladıklarına inanıyorum . Bu cevap neden olduğu findgibi davranmanın uygun olduğunu belirtir . Bu nedenlefind bu şekilde davranmak üzere tasarlanan zımni iddiayı destekleyecek yetkili referans bilgileriniz var mı?
G-Man 'Monica'yı Yeniden Başlat' diyor

4

findKomut ihtiyaçları yolu (ler) aramak için. Hiçbirini belirtmezsek ., başlangıç ​​noktası olarak geçerli dizini ( ) kullanır . Benzer şekilde, yolu geçerseniz, örneğin /tmp, bunu başlangıç ​​noktası olarak kabul eder. Ve dolayısıyla sonuçlar.

Geçerli dizin ise:

        $ find
or
        $ find .

output:
        ./file1
        ./file2
        ./file3

Eğer /tmpdizinde:

        $ find /tmp

output:
        /tmp/file4
        /tmp/file5

Eğer abcgeçerli dizin altında dizinde:

        $ find abc

output:
        abc/file6
        abc/file7

Geçerli dizinin altında birden çok dizin varsa:

        $ find fu bar

output:
        fu/file10
        fu/file11
        bar/file8
        bar/file9

Evet, findherhangi bir şeyi aramak için bir yola ihtiyaç duyduğunu ve geçerli dizinde varsayılan olduğunu kabul ediyorum . Soru, öncü ile aynı ./olduğunda neden çıktı yazdırmasıdır . file.txt./file.txt
nr

1
değil bu "" ekler. başlangıçta aslında "/ tmp" "abc" veya "." olsun, yol olarak verdiğiniz her şeyi ekler. Sırasıyla tüm değerleri döndürecektir.
Mrigesh Priyadarshi

-2

Bir yol belirtmezseniz, findkomut ${PWD}yolu olarak kabul eder ve çıktısına yazdırır. Yolu belirtmeyen kullanıcı findçalışma şeklini değiştirmez . Ve bul her zaman varsayılan olarak yollarla çalışır.


1
Anlıyorum. Ama bunu altında yürütürseniz /tmp, o $PWDzaman /tmpdeğildir ./.
nr

önceki görmek istiyorsanız /tmp, komutunu çalıştırın find /tmpBir yol belirtmezseniz, her zaman geçerli dizin olur./
MelBurslan

1
Önceden görmek istediğimden değil /tmp. Olamaz $PWD.
nr

Özür dilerim ${PWD}yanlış
sözlerdi

2
Hayır, $ PWD varsaymıyor. Çıktısını karşılaştırın find ., find $PWDve find(bir yol olmadan, bulmak destekliyorsa).
ilkkachu
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.