Cómo hacer que los xargs no coman espacios dobles

2

Estoy tratando de procesar algunos archivos con espacios dobles en el nombre. Parece que xargs está quitando espacios. Ejemplo

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

Observe que solo hay 1 espacio entre foo y bar , pero se pasaron 2. El ejemplo anterior funciona en Ubuntu 16.04 bash

Tenga en cuenta que estoy intentando procesar una lista de archivos como en

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

-O no funciona en este caso, ya que xargs ve el archivo completo como un nombre de archivo. Intenté -E '\n' pero aún así se comió el espacio adicional

    
pregunta gman 07.06.2017 - 19:44

2 respuestas

4

Aquí hay 3 posibilidades que pueden funcionar para usted:

1. BSD xargs

Esto está integrado en MacOS, pero requerirá que cites los nombres de archivo en tu list-of-files

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

nota: agregué la opción -t para mostrar el comando generado antes de que se ejecute.

$ 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 no está instalado en MacOS de forma predeterminada, pero se puede instalar a través de homebrew (en el paquete findutils).

brew install findutils

El uso de GNU xargs a través de homebrew no requiere que cites los nombres de archivo, y daría el mismo resultado que usar BSD xargs, y citar los nombres de archivo (opción 1, arriba).

3. buscar (en lugar de list-of-files )

En lugar de usar un archivo para su entrada, use el comando find . Algo como lo siguiente debería funcionar:

$ 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

O, evitando xargs completamente:

$ find . -name "file*" -exec echo "{}" \;
./file  4
./file1
./file2
./file 3
    
respondido por el Scot 08.06.2017 - 07:57
1

Aquí hay una solución para su problema usando sed para ajustar cada línea del archivo con comillas dobles.

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

Esto también funciona con GNU xargs .

    
respondido por el fd0 08.06.2017 - 15:16

Lea otras preguntas en las etiquetas