2011-05-18 13 views
19

me gustaría dar salida a la lista de elementos de una carpeta en la forma folowing:cómo dar salida a nombres de archivo rodeados de comillas en una sola línea?

"filename1" "filename2" "file name with spaces" "foldername" "folder name with spaces" 

En otras palabras, nombres de los elementos deben estar en una sola línea, rodeado de comillas (simples o dobles) y dividido por espacios.

sé que

find . | xargs echo 

impresiones de salida en una sola línea, pero no sé cómo agregar comillas alrededor de cada nombre del elemento.

Este código es parte de una secuencia de comandos bsh. La solución puede, por lo tanto, ser un conjunto de comandos y usar archivos temporales para almacenar resultados intermedios.

Muchas gracias por cualquier sugerencia.

Saludos, Ana

+0

Si el objetivo es pasar nombres con espacios a xargs, las comillas textuales son la forma incorrecta de hacerlo. –

Respuesta

18

esto debería funcionar

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' ' 

EDIT:

Esto debería ser más eficiente que la anterior.

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' ' 

@ solución de Timofey funcionaría con un pad en el final, y debe ser el más eficiente.

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' ' 
+0

¡Esto funciona genial! Muchas gracias. Mi último comando es ahora: "find.! -type l \ (-name. -o -prune \) | sort -n | sed 's/^ /"/g' | sed 's/$/"/ g' | tr '\ n' '' | xargs myCommand". Esta única línea era necesaria como parámetro de entrada para myCommand. – Ana

+0

Por favor, por favor no. Primero, 'find $ PWD' se comportará mal si su' $ PWD' contiene espacios o caracteres glob globales que se expanden a cualquier cosa. En segundo lugar, sustituir las comillas dobles alrededor de un nombre para intentar escapar es un mecanismo débil y fácilmente eludido: los nombres de archivo válidos pueden contener caracteres '' '' o '' ', lo que arroja un análisis sintáctico para todo el resto de la secuencia –

+0

@ Ana, si en un sistema con herramientas GNU ('find -print0' y' sort -z'), es mucho mejor usar 'find ... -print0 | sort -n -z | xargs -0 myCommand' –

13

probar esto.

find . -exec echo -n '"{}" ' \; 
+0

esto no funciona, obtengo la salida en varias líneas – Ana

+0

@Ana me funciona. –

+1

eliminar -n para obtener el resultado con nuevas líneas incluidas. – xastor

2
for f in *; do printf "'%s' " "$f"; done; echo 

O, gracias a Gordon Davisson:

printf "'%s' " *; echo 

El trailing echo es simplemente añadir una nueva línea a la salida.

+2

Esto se puede simplificar aún más: 'printf" '% s' "*'. –

26

Usted podría también encontrar uso simlpy "-printf", como en:

find . -printf "\"%p\" " | xargs your_command 

donde:

  %p  File's name. 

Este rodearán todos los archivos que se encuentran con citas y separar cada elemento con un espacio. Esto evita el uso de múltiples comandos.

+0

Esto debería marcarse como la respuesta correcta. La manipulación de expresiones regulares es de muy bajo nivel. –

+0

Tuve que agregar una nueva línea usando cygwin en Windows para que la salida sea la misma: '-printf" \ "% p \" \ n "' – jcarballo

+1

-printf No disponible en OSX. – Nimrod

1

EDIT:
la siguiente respuesta generar una nueva línea separó la lista en lugar de una sola línea.

  1. estoy segundo adivinar que la OP utiliza el resultado para invocar otro comando
  2. la conversión de la lista de salida para sola línea es fácil (| tr '\n' ' ')

Un método menos mencionado es utilizar -d opción (--delimiter) de xargs:

find . | xargs [email protected] -d"\n" echo \"@\" 

[email protected] capta cada resultado find como @ y luego nos hacemos eco-ED que con citas

Con esto se puede invocar cualquier comando de la misma manera que las cotizaciones añadido a los argumentos.

$ find . | xargs -d"\n" testcli.js 
[ "filename1", 
    "filename2", 
    "file name with spaces", 
    "foldername", 
    "folder name with spaces" ] 

Ver https://stackoverflow.com/a/33528111/665507

9

Puede utilizar la opción de GNU ls--quoting-style a conseguir fácilmente lo que está después. Desde la página del manual:

--quoting-style=WORD

uso citando estilo WORD de nombres de entrada: literal, locale, shell, shell-always, shell-escape, shell-escape-always, c, escape

Para ejemplo, usando el comando ls --quoting-style=shell-escape-always, la salida se convierte en:

'filename1' 'filename2' 'file name with spaces' 'foldername' 'folder name with spaces' 

Usando --quoting-style=c, se puede reproducir el ejemplo se desea exactamente. Sin embargo, si el resultado va a ser utilizado por un script de shell, debe usar uno de los formularios que escapa correctamente caracteres especiales, como shell-escape-always.

+1

relacionado: 'ls -Q'; # agrega comillas dobles – splaisan

Cuestiones relacionadas