Conversione da -exec a xargs nel comando find

Aug 24 2020

Sto usando il comando seguente nel mio script per eseguire dos2unixun'operazione sui file che copio da Windows a Linux. Sono presenti molti file, quindi è necessario molto tempo per eseguire questa operazione.

Ho cercato su Internet per ottimizzare questa ricerca e ho scoperto che possiamo usarla xargscon findinvece che -execper aumentare le prestazioni, ma sto lottando per convertire quella sottostante da utilizzare con xargs:

find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;

Risposte

1 waltinator Aug 24 2020 at 00:35

Crea uno script ~/binper elaborare un elenco di file, chiamalo doit, contenente

#!/bin/bash
while [[ $# -ne 0 ]] ; do thisfile="$1"
    shift
    dos2unix -k -n "$thisfile" tmp_file mv tmp_file "$thisfile"
done

Poi,

chmod +x ~/bin/doit

E infine,

find /path/to/files -type f -print0 | \
    xargs -0 -r $HOME/bin/doit

Leggi man find xargs bash.

8 Quasímodo Aug 24 2020 at 01:07

In realtà è molto più semplice. Non è necessario invocare una shell né usarla mvperché dos2unixmodifica già il file di destinazione se non gli si dà il -nflag.

find /path_to_files -type f -exec dos2unix -k -q -- {} +

-type fin modo che find cerchi solo file normali, non directory. -qflag viene assegnato in dos2unixmodo che non scriva messaggi informativi su stdout. E usiamo {} +invece di in {} \;modo che find non richiami un dos2unixprocesso per ogni file trovato, invece fornisce tutti i file che può come argomenti ( dos2unix file1 file2 file3 ...).

Xargs sarebbe solo un processo extra e quindi una penalità di tempo extra. Evita di invocare nuovi processi ogni volta che puoi.