-execdir ile bul


16

Ben çalıştırdığınızda findile -execdirI bekliyordum sonuç alamadım.

Örneğin:

mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
   ├── c
   └── foo
└── foo

Dizin cbir foodosya içermiyor . findHer bir dizinde yerel olarak bir şeyi ziyaret edip nasıl yapabilirim ?

Yanıtlar:


18

Her eşleşen dosya (yani her dizin) için, findonu içeren dizine (yani ana dizine) geçer ve belirtilen komutu yürütür. Komut eşleşmenin adını kullanmadığından, hiçbir zaman tüm dizinlerde işlem yapmaz. Bu belirli dizin ağacı için

(cd . && touch foo)        # because ./a matches
(cd ./a && touch foo)      # because ./a/b matches
(cd ./a/b && touch foo)    # because ./a/b/c matches

Her dizinde bir dosya oluşturmak için tek yapmanız gereken kullanabilirsiniz -execyerine -execdiruygulamanıza sağlanan findverir {}bir tartışma içine (çoğu ve özellikle tüm olanları sizce):

find . -type d -exec touch {}/foo +

POSIX taşınabilirliği için, dizin adının ve dosya tabanı adının birleştirilmesini el ile yapmanız gerekir.

find . -type d -exec sh -c 'touch "$0/foo"' {} \;

veya (biraz daha hızlı)

find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +

Alternatif olarak, bash'ın özyinelemeli joker karakter eşleştirmesini kullanabilirsiniz. (Ksh ve findzsh'deki karşılık gelen özellikten farklı olarak ve komutunuzun aksine ) dizinlere sembolik bağlantılar altında bash yinelemelerine dikkat edin .

shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done

Bir zsh çözümü:

touch ./**/(e\''REPLY+=foo'\')

FYI: man bash"-c" altındaki durumlar: komut_dizesinden sonraki bağımsız değişkenler $ 0 ile başlayan konum parametrelerine atanır, ancak "for d" $ 1 ile başlayan konum parametreleri arasında yinelenir. "_", $ 0'a atanan ve kullanılmayacak olan metindir.
Chad Skeeters

3

Komut, eşleşen bir dosya içeren her dizinde yürütülür. Yana cbir dizin içermiyor, bu uymuyor ve bu nedenle burada seçimlere edilmeyecektir.

Çözüm, dizin adını execdir bağımsız değişkenine şu şekilde eklemektir:

find . -type d -execdir touch {}/foo \;

2

itibaren man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

Eşleşen dizininiz dizinde cyaşar, bu bnedenle exec çalıştırılır. Dizinler yerine dosya arıyorsanız beklediğiniz gibi çalışır.

Dizinleri göndererek, dizinlerin xargstam listesini sağlayacağınız için muhtemelen istediğinizi başarabilirsiniz .

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.