Birisi lütfen aşağıdakileri yapmak için kod sağlayabilir mi? Tümünün bir program aracılığıyla çalıştırılması gereken bir dosya dizini olduğunu varsayın. Program sonuçları standart çıktı olarak veriyor. Bir dizine girecek, her dosyada komutu çalıştıracak ve çıktıyı büyük bir çıktı dosyasında birleştirecek bir betiğe ihtiyacım var.
Örneğin, komutu 1 dosya üzerinde çalıştırmak için:
$ cmd [option] [filename] > results.out
Aşağıdaki bash kodu $dosya'yı komuta iletir, burada $dosya /dir içindeki her dosyayı temsil eder
for file in /dir/*
do
cmd [option] "$file" >> results.out
done
Örnek
el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Şuna ne dersin?
find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out
-maxdepth 1
argümanı find'ın özyinelemeli olarak aşağıya inmesini engeller
herhangi bir alt dizin. (Bu tür iç içe geçmiş dizinlerin işlenmesini istiyorsanız, bunu atlayabilirsiniz).-type -f
sadece düz dosyaların işleneceğini belirtir.-exec cmd option {}
, bulunan her dosya için belirtilen option
ile cmd
çalıştırılmasını söyler, dosya adı {}
ile değiştirilir\;
komutun sonunu belirtir.cmd
yürütmelerinden elde edilen çıktı şu adrese yönlendirilir
results.out
Ancak, dosyaların işlenme sırasını önemsiyorsanız
bir döngü yazmanız daha iyi olabilir. Sanırım find
dosyaları işliyor
inode sırasına göre (bu konuda yanılıyor olabilirim), bu ne olmayabilir
İstiyorsun.
Jim Lewis'in yaklaşımına dayanmaktadır:
İşte find
kullanarak ve ayrıca dosyaları değişiklik tarihlerine göre sıralayarak hızlı bir çözüm:
$ find directory/ -maxdepth 1 -type f -print0 | \
xargs -r0 stat -c "%y %n" | \
sort | cut -d' ' -f4- | \
xargs -d "\n" -I{} cmd -op1 {}
Sıralama için bkz:
http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time