2 votes

Comment faire en sorte que xargs ne mange pas les espaces doubles

J'essaie de traiter des fichiers dont le nom comporte des espaces doubles. Il semble que xargs supprime les espaces. Exemple

$ echo "foo  bar" | xargs -I {} echo "{}"
foo bar

Remarquez qu'il n'y a qu'un seul espace entre foo y bar mais deux ont été adoptés. L'exemple ci-dessus fonctionne sous Ubuntu 16.04 bash

Notez que j'essaie en fait de traiter une liste de fichiers comme dans

cat list-of-files | xargs -I {} echo "{}"

-O ne fonctionne pas dans ce cas, car xargs considère le fichier entier comme un seul nom de fichier. J'ai essayé -E '\n' mais l'espace supplémentaire a quand même été consommé

4voto

kenneedham Points 92

Voici trois possibilités qui pourraient vous convenir :

1. BSD xargs

Cette fonction est intégrée à MacOS, mais vous devrez citer les noms de fichiers dans votre fichier list-of-files

$ more list-of-files
'file1'
'file2'
'file 3'
'file  4'

note : J'ai ajouté le -t afin d'afficher la commande générée avant qu'elle ne s'exécute.

$ cat list-of-files | xargs -t -I {} echo "{}"
echo file1
file1
echo file2
file2
echo file 3
file 3
echo file  4
file  4

2. GNU xargs

GNU xargs n'est pas installé par défaut sur MacOS, mais peut l'être via homebrew (dans le paquetage findutils).

brew install findutils

L'utilisation de GNU xargs via homebrew ne nécessite pas de citer les noms de fichiers et donne le même résultat que l'utilisation de BSD xargs et la citation des noms de fichiers (option 1, ci-dessus).

3. trouver (au lieu de list-of-files )

Plutôt que d'utiliser un fichier pour vos entrées, utilisez la fonction find commande. Quelque chose comme ce qui suit devrait fonctionner :

$ ls -laF file*
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file  4
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file 3
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file1
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file2

$ find . -name "file*" | xargs -0 -I {} echo "{}"
./file  4
./file 3
./file1
./file2

Ou en évitant complètement xargs :

$ find . -name "file*" -exec echo "{}" \;
./file  4
./file1
./file2
./file 3

1voto

Michael Zhou Points 167

Voici une solution pour résoudre votre problème en utilisant sed pour entourer chaque ligne du fichier de guillemets doubles.

sed 's/\(.*\)/"\1"/' < list-of-files | xargs -I {} echo {}

Cela fonctionne également avec GNU xargs .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X