-Exec kullanırken dosya ismini find komutunda nasıl çıkardın?


33

PWD'nin tüm alt dizinlerini bulmak ve svnadmin verifyher dizinde çalıştırmak için aşağıdaki satırı kullanıyorum (zaten Subversion depoları olduğunu biliyorum)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Bu, çıktının şöyle görünmesi dışında, iyi çalışır:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

Günlüğe kaydetmeyi kolaylaştırmak findiçin svnadmin verifykomutu çalıştırmadan önce dosya adını yazdırmayı çok isterdim .

lsOrada biraz sıkmaya çalıştım, ama kafamı karıştırdı, bunu nasıl yapmalıyım (tercihen basitçe)?

Yanıtlar:


36

-printfönce bir seçenek eklemeniz yeterlidir

find -printf '%p' -exec command \;

4
Güzel, ben değiştim '%p'için '%p\n'bu kadar isim ilerlettiği o kendi satırında çıktı doğrulamanızı.
Arronical

17
Eğer istediğin türde olup olmadığını, sen yerini alabilir @Arronical (biçimlendirilmiş) -printf '%p\n'daha basit olan-print
steeldriver

4
find -name <a_name> -print -exec command {} \;
toliveira

14

Eğer tekrar etmek istemiyorsan, kullanmanın bir anlamı yok find. Doğrudan kabuğun içinde yapmak çok daha kolaydır:

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */Tüm dizinleri (bulacaksınız */sadece dizinleri olmasını sağlar ve hiçbir dosya bulunur); echo "$d"dizinin adını yazdırır; svnadmin verify "$d"dizini kontrol edecektir.

Bu, doğrudan komut satırından veya bir komut dosyasından biçim değişikliği yapmadan çalıştırılabilir.


1
Bu, hedefime ulaşmak için daha iyi bir yol gibi görünüyor, ancak ünvanım ve soru referansım findçok fazla olduğu için Fiximan'a cevap vermek zorunda kaldım . Yine de bilgimi geliştirdiğin için teşekkürler!
Arronical

Bu bir glob kullanmayı gerektirir. Globbing kesinlikle faydalı ve güçlüdür, ancak kişisel deneyimime göre sözdiziminin kurulması daha zordur ve genellikle daha uzun, daha karmaşık bir senaryo oluşturan bash gibi dotglobve diğer şeylere ihtiyaç duyar globstar. Büyük karmaşık işler için dünyayı kurtarmaya meyilliyim, ancak findsöz diziminin bir demet filtreyi ve komutları tek bir astarın içine çekerek bir araya gelmesi daha kolay.
user5359531,

@ user5359531 ne globstar ne de dotglob (gizli dosyalara sahip olduğunuzu bilmiyorsanız ve aslında onları istemediğiniz sürece) burada gereklidir. Bu açıkçası bir fikir meselesidir, ancak daha geniş ve findbasit formatı düşünen ilk karşılaştığınız kişisiniz . Ben sadece her zaman finddaha basit bulmuyorum, aynı zamanda başka programlara aktarılan keyfi dosya isimleri ile uğraşırken de daha güvenli olduklarından, her zaman globları tercih ederim .
terdon

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

-type dYalnızca dizinlerse ekledim .


Ben alıntı ediyorum {}en azından içinde,svnadmin verify {}
kos

Hızlı cevap için teşekkürler. Öyleyse bu komutta -execspawn, 2 komutun uygulandığı, ;satır sonu olarak kullanılan bir çocuk kabuğu mu yaratıyor?
Arronical

5

Bunu dene:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Sadece dizinleri istiyorsanız (Teşekkür notu kos):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Güzel, ama bu aynı zamanda dosyaları for f in */işleyecektir: sadece dizinleri işleyecektir
kos

Bu sadece bir betikte çalışır mı? Veya komut satırında yayınlayabilir miyim?
Arronical

1
@Arronical komut satırı olarak da çalışacaktır
Maythux

2
  • . -maxdepth 1Bunun yerine kullanın ./*, klasör yapısında yalnızca ilk seviyeye ihtiyacınız var
  • Kullan -type d, sadece klasörlere ihtiyacın var
  • Kullan ! -name ".", ihtiyacın yok.
  • -execBir kabuk başlatmak için kullanın
  • sh -cKabuğun içindeki komutları başlatmak için kullanın .

Senin emrin

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

veya daha kısa

  • kullanım -prune dosya bir dizin ise içine inerler yok,

Senin emrin

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-pruneilgi çekici görünüyor. ./* -maxdepth 0Find .komutundan geri dönmekten kaçınmak için kullanılır . Kritik bir hataya neden olmaz, ancak çıktımda buna sahip olmamayı tercih ederim.
Arronical

1

findDiğer cevaplarda daha önce belirtilen yazdırma için seçenek bayraklarına sahiptir. Soruna şu anda işlenen dosya için birden fazla komut yürütme perspektifinden bakarsak, birden findfazla -execifadenin kullanılmasına izin verir . Bu, kullanmayı tercih edebileceğimiz anlamına gelir:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

Yine, bu yaklaşım sadece basılmıyor uygulanabilir not olduğunu echo, printfya da diğer kamu hizmetleri, aynı zamanda diğer komutlar.


0

findÇıktının readdöngünün borularına bağlanması yararlı olabilir :

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

findBu süslü lsörnekte olduğu gibi döndürülen dosya adlarıyla daha karmaşık, bileşik komut dizisi çalıştırmanıza olanak tanır :

find . | while read f; do echo ${f} | figlet -k; done

-1

Bu, sadece dosyaların adını ve içeriğini yinelemeli olarak yazdıracaktır.

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
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.