-exec - xargs dönüşümü find komutunda

Aug 24 2020

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

1 waltinator Aug 24 2020 at 00:35

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.

8 Quasímodo Aug 24 2020 at 01:07

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.