¿Cómo unir varias líneas de nombres de archivo en una con delimitador personalizado?


Me gustaría unir el resultado de ls -1 en una línea y delimitarlo con lo que quiera.

¿Hay algún comando estándar de Linux que pueda usar para lograr esto?

Author: kenorb, 2010-05-04

19 answers

Similar a la primera opción pero omite el delimitador final

ls -1 | paste -sd "," -
 483
Author: Artem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-23 12:23:01

EDITAR: Simplemente "ls -m" Si quieres que tu delimitador de ser una coma

¡Ah, el poder y la simplicidad !

ls -1 | tr '\n' ','

Cambiar la coma "," a lo que quieras. Tenga en cuenta que esto incluye una "coma final"

 331
Author: zaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 19:19:14

Esto reemplaza la última coma con una nueva línea:

ls -1 | tr '\n' ',' | sed 's/,$/\n/'

ls -m incluye nuevas líneas en el carácter screen-width (80th por ejemplo).

Principalmente Bash (solo ls es externo):

saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS

Usando readarray (también conocido como mapfile) en Bash 4:

readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS

Gracias a gniourf_gniourf por las sugerencias.

 18
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-23 16:37:56

Creo que este es impresionante

ls -1 | awk 'ORS=" "'
 15
Author: majkinetor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-13 21:11:54

La combinación de ajuste IFS y el uso de "$*" puede hacer lo que quieras. Estoy usando un subshell para no interferir con este shell IFS IFS

(set -- *; IFS=,; echo "$*")

Para capturar la salida,

output=$(set -- *; IFS=,; echo "$*")
 14
Author: glenn jackman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-05 22:57:11

Analizar ls en general no se recomienda , por lo que la mejor manera alternativa es usar find, por ejemplo:

find . -type f -print0 | tr '\0' ','

O utilizando find y paste:

find . -type f | paste -d, -s

Para unir múltiples líneas en general (no relacionadas con el sistema de archivos), marque: "Unir" conciso y portable en la línea de comandos de Unix.

 11
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:14

No reinventes la rueda.

ls -m

Hace exactamente eso.

 9
Author: Tulains Córdova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-15 20:22:10

Solo bash

mystring=$(printf "%s|" *)
echo ${mystring%|}
 7
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-04 11:18:12

Este comando es para los fans de PERL:

ls -1 | perl -l40pe0

Aquí 40 es el código ascii octal para el espacio.

- p procesará línea por línea e imprimirá

-l se encargará de reemplazar el \n final con el carácter ascii que proporcionemos.

-e es informar a PERL que estamos ejecutando la línea de comandos.

0 significa que en realidad no hay ningún comando que ejecutar.

Perl-e0 es lo mismo que perl-e ' '

 7
Author: Sidharth C. Nadhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-03 09:16:32

Para evitar una posible confusión de nueva línea para tr podríamos agregar la bandera-b a ls:

ls -1b | tr '\n' ';'
 6
Author: yabt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-04 09:34:24
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

Explicación:

-e - indica un comando a ejecutar
:a - es una etiqueta
/$/N - define el alcance de la coincidencia para la línea actual y la (N)ext
s/\n/\\n/; - reemplaza todo EOL con \n
ta; - goto etiqueta a si el partido es exitoso

Tomado de mi blog.

 3
Author: Anand Rajasekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-19 19:34:53

Puedes usar:

ls -1 | perl -pe 's/\n$/some_delimiter/'
 2
Author: codaddict,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-04 09:23:58

Si su versión de xargs soporta la bandera-d entonces esto debería funcionar

ls  | xargs -d, -L 1 echo

- d es la bandera delimitadora

Si no tienes -d, entonces puedes probar lo siguiente

ls | xargs -I {} echo {}, | xargs echo

El primer xargs le permite especificar su delimitador que es una coma en este ejemplo.

 2
Author: Chris J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-04 09:31:39

ls produce una salida de columna cuando se conecta a una tubería, por lo que -1 es redundante.

Aquí hay otra respuesta de perl usando la función builtin join que no deja un delimitador final:

ls | perl -F'\n' -0777 -anE 'say join ",", @F'

El oscuro -0777 hace que perl lea toda la entrada antes de ejecutar el programa.

alternativa sed que no deja un delimitador final

ls | sed '$!s/$/,/' | tr -d '\n'
 2
Author: Thor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-13 15:26:37

Parece que las respuestas ya existen.

Si quieres a, b, c formato, uso ls -m ( Respuesta de Tulains Córdova )

O si quieres el formato a b c, usa ls | xargs (versión simpificada de La respuesta de Chris J )

O si desea cualquier otro delimitador como |, use ls | paste -sd'|' (aplicación de La respuesta de Artem )

 2
Author: plhn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:50

El camino del sed,

sed -e ':a; N; $!ba; s/\n/,/g'
  # :a         # label called 'a'
  # N          # append next line into Pattern Space (see info sed)
  # $!ba       # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
  # s/\n/,/g   # any substitution you want

Nota:

Esto es lineal en complejidad, sustituyendo solo una vez después de que todas las líneas se anexan al Espacio Patrón de sed.

@AnandRajaseka respuesta , y algunas otras respuestas similares, tales como aquí , son O(n2), porque sed tiene que hacer sustituir cada vez que se añade una nueva línea en el Espacio del Patrón.

Para comparar,

seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
  # linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
  # quadratic, hung
 2
Author: zhazha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-28 12:29:58

Añadiendo en la parte superior de la respuesta de majkinetor, aquí está la forma de eliminar el delimitador final (ya que no puedo simplemente comentar bajo su respuesta todavía):

ls -1 | awk 'ORS=","' | head -c -1

Simplemente elimine tantos bytes finales como cuente su delimitador.

Me gusta este enfoque porque puedo usar delimitadores de caracteres múltiples + otros beneficios de awk:

ls -1 | awk 'ORS=", "' | head -c -2
 1
Author: Aleksander Stelmaczonek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-03 15:16:25

ls tiene la opción -m para delimitar la salida con ", " una coma y un espacio.

ls -m | tr -d ' ' | tr ',' ';'

Canalizar este resultado a tr para eliminar el espacio o la coma le permitirá canalizar el resultado nuevamente a tr para reemplazar el delimitador.

En mi ejemplo sustituyo el delimitador , por el delimitador ;

Reemplace ; con lo que prefiera un delimitador de caracteres ya que tr solo tiene en cuenta el primer carácter en las cadenas que pasa como argumento.

 0
Author: Andrew Anthony Gerst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-30 12:47:26

Puede usar chomp para combinar varias líneas en una sola línea:

Perl-e 'while ( ) {if (/\print/) {chomp; } print;}' bad0 > test

Poner la condición de salto de línea en si statement.It puede ser un carácter especial o cualquier delimitador.

 0
Author: Suman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 00:28:35