Conversione da -exec a xargs nel comando find
Sto usando il comando seguente nel mio script per eseguire dos2unix
un'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 xargs
con find
invece che -exec
per 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
Crea uno script ~/bin
per 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
.
In realtà è molto più semplice. Non è necessario invocare una shell né usarla mv
perché dos2unix
modifica già il file di destinazione se non gli si dà il -n
flag.
find /path_to_files -type f -exec dos2unix -k -q -- {} +
-type f
in modo che find cerchi solo file normali, non directory. -q
flag viene assegnato in dos2unix
modo che non scriva messaggi informativi su stdout. E usiamo {} +
invece di in {} \;
modo che find non richiami un dos2unix
processo 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.