Bir klasördeki tüm dosyalar üzerinde bir betiği çalıştırmak için bir Otomator servisi nasıl oluşturulur


2

Bir klasördeki tüm dosyalar üzerinde bir kabuk betiğini çalıştırmak için Automator kullanarak bir hizmet oluşturmak istiyorum, tüm günlük dosyalarını sil diyelim. Yaptığım şey

  1. Automator'da yeni bir servis yaratıldı.
  2. Bir "Shell Komut Dosyasını Çalıştır" eylemi eklendi. Şimdilik bunu 'pwd' olarak değiştirdim.
  3. Seçilen "Servis seçilen klasörleri alır".
  4. Çalıştırmaya çalıştım ama bir mesaj al. "Bu hizmeti Automator'da test etmek için, iş akışınızın başlangıcına" Belirli Bulucu Öğeleri Al "işlemini ekleyin. İş akışını Automator dışında çalıştırmadan önce işlemi kaldırın veya devre dışı bırakın.
  5. TAMAM. Böylece "Belirtilen Bulucu Öğeleri Al" ekliyorum. Öğe listesine bir 'test' dizini eklendi.

Şimdi, betiği çalıştırdığımda, sonuçlar penceresi ana dizini yazdırıyor.

Başka bir yerde, belki de eklemek zorunda olduğumu okudum

cd "$1"

senaryonun başına Bunu yaptım ama yine de ev dizinimi yazdırıyor. Bu şeyi "Belirtilen Bulucu Öğeleri Al" seçeneğinde seçtiğim dizini yazdırmak için nasıl alabilirim?

Eklemek için Düzenlendi

İşte çalışan bir betiğin ekran görüntüsü.

Ölçek

İşte bir ekran görüntüsü os işe yaramazsa bir komut dosyası.

görüntü tanımını buraya girin

"Eşleşme bulunamadı: * .log" hatasıyla başa çıkmamın normal yolu, hata çıktısını null'a yönlendirmektir. "Rm" satırını değiştirmek

find . -name "*.log" -print0 | xargs -0 rm -rf

Yine de çalışır. Bu olması gerekenden daha zor görünüyor.


Size çalışan bir örnek göstermek için cevabımı güncelledim, bir göz atın ve herhangi bir sorunuz olursa bana bildirin.
user3439894

Yanıtlar:


3

Eğer bir oluşturuyorsanız Hizmetleri kullanarak RunShell Komut seçilen geçmek istediğiniz Klasör (ler) için RunShell Komut ve ek eylemler gerçekleşecek olan senaryo üzerlerinde, daha sonra bu ayarlarla başlayın.

Hizmet Yaratın:

  1. Açık Otomatikleştirici basıp Servis veya Dosya > Yeni > Servis Eğer Otomatikleştirici zaten açık.

  2. Set Servis seçilen aldığı için klasörlere ve içinde hiç Finder .

  3. Bir ekleme Run Shell Senaryo Eylem ayarı, : Shell için / bin / bash ve giriş geçirin: için
    argümanlar olarak . Bu varsayılan değiştirir kod ila catiçin:

    for f in "$@"
    do
        echo "$f"
    done

Artık $fhedef Klasör (ler) üzerinde hareket etmek için kullanabilirsiniz , örneğin cd $fve şimdi dizinin içindesiniz $fve içindeki dosyalar / klasörler vb. Üzerinde hareket etmek için ek kod ekleyebilirsiniz $f.

Güncelleme:

Örnek olarak aşağıdaki çalışma kodunu kullanın :

for d in "$@"; do
    cd "$d"
    for f in *.log; do    
        rm "$f"
    done
done

İçinde Testi ve test kopyası klasörlerin bir dizi vardı .Log yanı dosyalar ve diğer uzantılı dosyalar. Yukarıdaki kod çalıştırıldığında, sadece iki klasör veya bir klasör kullanarak aşağıdaki görüntülerde gösterildiği gibi hedef klasörlerin içindeki * .log dosyalarını ve adlarında boşluk içeren / olmayan dosyaları ve klasörleri siler.


görüntü tanımını buraya girin


görüntü tanımını buraya girin


1
Teşekkürler. Bu işe yarıyor. Kaybettiğim bit "Pass input: argümanlar olarak" idi. Bununla birlikte, cd $ 1 satırlarını eklediğimde, rm * .log 2> / dev / null "Kabuk Komutunu Çalıştırma - 1 hatası" hatası vererek başarısız oluyor ve daha aydınlatıcı bir şey yok.
Pheon

@ pheon, Birinin kodunu uygun bir mcve olmadan gidermeyi denemek zordur. Ayrıca, bir Run Shell Script kullanırken, gibi yönlendirmeleri kullanmaya gerek yoktur 2>/dev/null. cdAutomator Servisine aktarılan Klasöre geçmeye çalışıyorsanız forloop ve cd $f`` as I said, not cd $ 1` kullanmanız gerekir . Mcve'yi okuyun ve doğru sorun giderme için sorunuza ek bilgiler ekleyin, aksi halde yapabileceğim bir şey yok. Ayrıca , Automator hizmetinizde yazıldığı gibi kullanılan bir kodun ekran görüntüsünü de eklemeniz gerekir .
user3439894

Klasörde hiçbir .log dosyası yoksa bu benim için başarısız olur.
pheon

@pheon. Lütfen verilen kodun örnek / örnek kod olduğunu ve bir şeyin işe yarayabileceğini göstermek için genellikle minimum düzeyde olduğunu unutmayın. Külfeti üzerinde kullanıcıya uygun hata denetimi yazmak için kod ve onu yerine getirirler. Bu haftasonu bir aramaya bakacağım ve mevcut örnek / örnek kodda hata denetimi yaparak değişiklik / ekleme yapacağım .
user3439894 19

İlk düşündüğümden daha karmaşık olduğunu takdir ediyorum. Kabul etmenin kolay olacağını düşündüm. Bunu, otomatikleştirici öğrenme alıştırması olarak kullanıyordum. Sinir bozucu olan şey, terminalden çalışan bir bash shell betiğinin doğrudan otomatikleştiriciye çevrilmemesi ve otomatik değiştiricinin bu betiğin başarısız olması durumunda yararlı tanı mesajları vermemesidir. Yardımınız için teşekkürler. Buradan, sadece bulmacanın tadını çıkarırsanız sorunu çözmeye yardımcı olmak gerekir; Bash betiğini istediğiniz gibi kullanarak bir çalışma bulacağım.
Pheon
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.