-exec - xargs dönüşümü find komutunda
dos2unixWindows'tan Linux'a kopyaladığım dosyalar üzerinde bir işlem gerçekleştirmek için komut dosyamda aşağıdaki komutu kullanıyorum . Çok sayıda dosya var, bu nedenle bu işlemi gerçekleştirmek önemli miktarda zaman alıyor.
Bu find optimize etmek için internet üzerinde arama ve kullanabileceğimiz bulundu xargsile findyerine -execperformansını artırmak için, ama birlikte kullanılmak üzere birine altına dönüştürmek için mücadele ediyorum xargs:
find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;
Yanıtlar
Bir ~/bindosya listesini işlemek için bir komut dosyası oluşturun , çağırın doit, şunları içeren
#!/bin/bash
while [[ $# -ne 0 ]] ; do thisfile="$1"
shift
dos2unix -k -n "$thisfile" tmp_file mv tmp_file "$thisfile"
done
Sonra,
chmod +x ~/bin/doit
Ve sonunda,
find /path/to/files -type f -print0 | \
xargs -0 -r $HOME/bin/doit
Okuyun man find xargs bash.
Aslında çok daha basit. Bir kabuğu çağırmanıza veya kullanmanıza gerek yoktur mvçünkü dos2unixeğer ona -nbayrak vermezseniz hedef dosyayı zaten değiştirir .
find /path_to_files -type f -exec dos2unix -k -q -- {} +
-type fböylece bu, dizinleri değil, yalnızca normal dosyaları arar. stdout'a bilgi mesajları yazmaması -qiçin bayrak verilir dos2unix. Bunun {} +yerine, {} \;find'ın dos2unixbulunan her dosya için bir işlem çağırmaması yerine arguments ( dos2unix file1 file2 file3 ...) olarak verebildiği kadar çok dosya verir .
Xargs sadece bir ekstra işlem ve dolayısıyla bir ekstra zaman cezası olacaktır. Mümkün olduğunca yeni süreçleri kullanmaktan kaçının.