-exec en xargs conversion dans la commande find
J'utilise la commande ci-dessous dans mon script pour effectuer une dos2unixopération sur les fichiers que je copie de Windows vers Linux. Il y a beaucoup de fichiers, donc cela prend un temps considérable pour effectuer cette opération.
J'ai cherché sur Internet pour optimiser cette découverte et j'ai trouvé que nous pouvons utiliser xargsavec findau lieu d' -execaugmenter les performances, mais j'ai du mal à convertir celui ci-dessous à utiliser avec xargs:
find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;
Réponses
Créez un script ~/binpour traiter une liste de fichiers, appelez-le doit, contenant
#!/bin/bash
while [[ $# -ne 0 ]] ; do thisfile="$1"
shift
dos2unix -k -n "$thisfile" tmp_file mv tmp_file "$thisfile"
done
Ensuite,
chmod +x ~/bin/doit
Et enfin,
find /path/to/files -type f -print0 | \
xargs -0 -r $HOME/bin/doit
Lisez man find xargs bash.
C'est en fait beaucoup plus simple. Vous n'avez pas besoin d'appeler un shell ni d'utiliser mvcar dos2unixmodifie déjà le fichier cible si vous ne lui donnez pas le -ndrapeau.
find /path_to_files -type f -exec dos2unix -k -q -- {} +
-type fde sorte que find ne recherche que les fichiers normaux, pas les répertoires. -qflag est donné à dos2unixafin qu'il n'écrive pas de messages d'information dans stdout. Et nous utilisons {} +au lieu de {} \;pour que find n'invoque pas un dos2unixprocessus pour chaque fichier trouvé, mais donne autant de fichiers que possible en arguments ( dos2unix file1 file2 file3 ...).
Xargs ne serait qu'un processus supplémentaire et donc une pénalité de temps supplémentaire. Évitez d'appeler de nouveaux processus chaque fois que vous le pouvez.