Bulunan dosyanın dizininde (geçerli dizinde değil) komut yürütmek için `find -exec` nasıl kullanılır?


15

Diyelim ben, bazı alt dizinleri olan bir dizinde olduğumu söylüyor dir1, dir2ve dir3. Bu dizinlerin her biri bir dosya var foove ben fooher dizinlerin her birinde aynı komutu yürütmek ve bu komut o dizinin içinden çalıştırılmasını istiyorum.

Eğer "elle" yapacak olsaydım, şöyle bir şey olurdu:

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

Komutun her bir dizinden yürütülmesi zorunludur . foobir toplu zamanlama komut dosyasıdır (eğer bilmek isterseniz HTCondor için) ve zamanlama komut dosyaları tarafından başlatılan çalışmaların çıktısının her bir alt dizinde bitmesi için her alt dizinden yürütülmelidir.

Sorusu " Bir dosya bulun ve dosyanın dizininde bir komut çalıştırmak " bildiğim kadarıyla söyleyebilirim, soruma cevap vermez. Bu sorunun ilk cevabı, benim durumumda işe yaramayacak bir geçici çözümdür ve ikinci cevap, nasıl kullanılacağını bilmem için yeterli bir açıklamaya sahip değildir.


@roaima, lütfen bunun nasıl bir kopya olduğunu açıklayın. Bu sorunun ilk cevabı yok değil etrafında daha bir eserin var, bana yardım ve ikinci Cevap bana hiç mantıklı değil. Nasıl kullanılacağını bilmek benim için daha fazla açıklamaya ihtiyaç duyuyor.
NeutronStar

Yanıtlar:


23

findDesteklerinizi varsayarsak, -execdiryerine seçeneği kullanın-exec

find * -name 'foo' -execdir pwd \;

Değilse, lütfen platformunuzun ve / veya dağıtımınızın ayrıntılarını (uygun olduğu şekilde) sağlayın.


"Find: './node_modules/.bin' göreli yoluna PATH ortam değişkenine dahil edilir,": askubuntu.com/questions/621132/…
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Böyle yazabilirsem özür dilerim, ama -execdir (Ubuntu'da) boktur, çünkü size vermez {}, ama ebeveyni {}.
İHA

1
@uav, kullanım durumunuzu bilmeden size yardımcı olamam. Ancak whinge yanıtınıza belgeler açıkça " Beğen -exec, ancak belirtilen komut eşleşen dosyayı içeren alt dizinden çalıştırılır " ifadesini açıkça belirtir .
roaima

Evet, doğru, -type d (= dizin) için arıyorsanız ve bu durumda alt-optimal ise özel bir durumdur.
İha

Kullanım durumunuzu bilmeden size yardımcı olamam.
roaima

4

Komutunuzu hangi dizinlerde çalıştıracağınızı tam olarak bildiğinizi varsayarsak,

for dir in dir1 dir2 dir3; do
    ( cd "$dir" && somecommand foo )
done

veya foodosyalar üzerinde döngü

for foo in */foo; do
  ( cd "${foo%/*}" && somecommand foo )
done

Alt kabuk cd, komut dosyasının geri kalanının çalışma dizinini etkilemesini önler . ${foo%/*}Dizinin adının parametre ikame genişlediğinde foo(son sonra her şeyi kaldırarak dosya yaşadığı /değerinde $foo).

findAynı şeyi yapmak için standardı kullanma ( foodosyaların bir dizin yapısında derinlemesine yaşayabileceği durumlarda ):

find . -type f -name foo -exec sh -c '
    for foo do
        ( cd "${foo%/*}" && somecommand foo )
    done' sh {} +

Kelime ile: Geçerli dizinde veya altında herhangi bir yerde "foo" adı verilen tüm normal dosyaları bulun ve yol isimlerini bu kabuk betiğine toplu olarak verin. Kabuk betiği, verilen yol adları üzerinden yinelenir, dizini her yol adının dizin bölümüne değiştirir ve başarılı olursa yürütür somecommand foo.

Standart dışı kullanan bir çözüm -execdiriçin roaima'nın cevabına bakınız . Cevabı benim örneğime uyarlandı:

find . -type f -name foo -execdir somecommand foo ';'
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.