2 votos

Cómo conseguir que xargs no se coma los espacios dobles

Estoy tratando de procesar algunos archivos con doble espacio en el nombre. Parece que xargs elimina los espacios. Ejemplo

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

Observe que sólo hay un espacio entre foo y bar pero 2 fueron pasados dentro. El ejemplo anterior funciona en Ubuntu 16.04 bash

Tenga en cuenta que en realidad estoy tratando de procesar una lista de archivos como en

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

-O no funciona en este caso ya que xargs ve todo el archivo como un solo nombre de archivo. He probado con -E '\n' pero que todavía se comió el espacio extra

1 votos

Prueba a añadir -0 al comando xargs. Esto es probablemente una diferencia entre GNU xargs (en Ubuntu) y BSD (en MacOS).

1 votos

En realidad, xargs (sin -0 ) se confunde con cualquier espacios (o algunos otros caracteres) en los nombres de archivos. En su ejemplo, en realidad ve "foo" y "bar" como dos elementos separados (y luego echo los empalma con un solo espacio entre ellos). Véase BashFAQ #20: ¿Cómo puedo encontrar y manejar con seguridad los nombres de archivos que contienen nuevas líneas, espacios o ambos? para una buena colección de técnicas.

0 votos

Lo siento, debería haber sido más específico. Tengo una lista de archivos en un archivo de texto así que -0 no es útil por sí mismo. Tal vez necesito algún otro comando para escupir el archivo a insertar \0 ¿para las nuevas líneas?

4voto

abjbhat Puntos 184

Aquí hay 3 posibilidades que pueden funcionar para usted:

1. BSD xargs

Esto está incorporado en MacOS, pero requerirá que cite los nombres de los archivos en su list-of-files

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

nota: he añadido el -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 por defecto en MacOS, pero puede instalarse a través de homebrew (en el paquete findutils).

brew install findutils

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

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

En lugar de utilizar un archivo para su entrada, utilice la función find de mando. 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 bien, evitar completamente los xargs:

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

1voto

Michael Zhou Puntos 167

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

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

Esto también funciona con GNU xargs .

0 votos

@usuario3439894 {} es un marcador de posición y se puede utilizar cualquier carácter como marcador de posición. No es necesario citar el marcador de posición. La redirección es opcional.

0 votos

Sé que el xargs opción I replstr puede ser X como lo tenías, sin embargo he usado lo que estaba en el OP para evitar cualquier confusión al comparar lo que se usaba en el OP y la otra respuesta. El < aunque es opcional, es totalmente innecesario en este caso de uso ya que sed va a leer lo especificado archivo Por ejemplo list-of-files después de su opciones y comando(s) . Si no estás contento con los cambios que he hecho, obviamente eres libre de volver a tu respuesta original.

0 votos

Esto funcionará siempre que la entrada no contenga comillas dobles. Una solución más general podría ser la de hacer desaparecer cualquier barra invertida, espacio, tabulador, comilla simple o comilla doble. sed $'s/[ \t\\"\']/\\\\&/g' (¡perdón por las horrendas citas anidadas!)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X