Yazılmakta olan dosyalar hariç bir klasördeki tüm dosyalar nasıl kopyalanır?


12

HTTPiedownloading aracılığıyla bir klasöre birden fazla dosya indiriyorum . Bir bash betiği indirilen dosyaları işlemeyi amaçlar ve indirilen dosyaları başka bir klasöre kopyalamaya çalıştım.

find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;

ancak bu henüz tamamlanmamış dosyaları da kopyalar. -mmin +5Komuta ekleyerek eski dosyalara aktarımı sınırlamaya çalıştım . Dosyaları yazılmakta ve yalnızca indirilmiş dosyaları aktarmak için etkili komut nedir?


Aynı dosya sistemine kopyalanıyor ve indiriciyi yeniden adlandırmayacak şekilde ayarlıyorsanız (önce indirip %.part% olarak yeniden adlandırın). İndirici iyi davranıyorsa (garip bir şey yapmazsa), mvdosyaları yeniden adlandırabilmeniz gerekir .
ctrl-alt-delor

1
Ne tür bir işlem yapmaya çalışıyorsunuz? Büyük olasılıkla, bir boru hattı kullanmak gibi çok daha basit bir seçenek var.
gardenhead

Yanıtlar:


11

Çok verimli değil, ancak şunları yapabilirsiniz:

find /folder/downloading -type f -exec sh -c '
  for file do
    lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
  done' sh {} +

Bu dosya, ile sıralanmadığına çek wayin aolarak Dışı Erişim modu li sarasında t okalem fönce iles mo ving.

psmiscUygulanması fusergenellikle Linux tabanlı işletim sistemleri üzerinde bulunan bir sahiptir -wile işlevini (dosyalar yazmak için açılmamış denetlemek için) ama ne yazık ki sadece işi -ktekabül süreçleri öldürmek için. Ancak, yine de hiçbir şey yapmayan sözde sinyal 0'ı kullanarak kullanabilirsiniz:

find /folder/downloading -type f -exec sh -c '
  for file do
    fuser -s -w -k -0 "$file"  || mv "$file" /folder/downloaded
  done' sh {} +

Hangi işlemlerin hareket etmesini engellediğini görmek istiyorsanız -s(veya yerine yenisiyle değiştirin -v) kaldırın .

Bu komutları süper kullanıcı olarak çalıştırmıyorsanız, yalnızca işlemleriniz hakkında bilgi alacağınızı unutmayın. Dosyaları indiren işlemler farklı bir kullanıcı olarak çalışıyorsa, algılanmazlar.

Ayrıca, dosyaları farklı bir dosya sistemine taşımadığınız sürece, dosyaların taşınmasının, dosyaya yazmakta olan işlemlerin dosyaya yazmayı bitirmesini engellemeyeceğini unutmayın.

Onlar yazma bitirdikten sonra, dosya artık eğer Ancak, onlar sonradan yapılacak tasarlanmış oldum ne bağlı, bunlar karışık olabilir orada (örneğin onlar bunu indirdikten sonra dosyanın bazı özelliklerini değiştirmek istiyorum ve eğer bunu değil dosya tanımlayıcı aracılığıyla ( chmod()vs gibi fchmod()veya utimes()bir dosya tanımlayıcı aracılığıyla yapılamaz).


Shell sorusu: Kodunuzu bir istisna dışında anlıyorum. -execÇalıştıran shtek bir komut ile ( -c '...') ve {} +bir anda o komutun içine birden fazla sonuç koymak söyler. Anlamadığım şey sh, komuttan sonra neden başka bir tane daha var . Neyi kaçırıyorum?
Joe

2
@Joe, satır içi betiklerin içine giren bu $0. Yani, bu satır içi komut dosyasına bir ad verir . Bu ad, <name>: fuser: command not foundörneğin hata mesajlarında kullanılabilir , bu shnedenle genellikle bu hata mesajını neyin rapor ettiğini netleştirmek için iyi bir seçimdir (ayrıca, inline-script).
Stéphane Chazelas
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.