¿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?
19 answers
Similar a la primera opción pero omite el delimitador final
ls -1 | paste -sd "," -
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"
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.
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=" "'
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 "$*")
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.
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.
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%|}
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 ' '
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' ';'
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)exts/\n/\\n/;
- reemplaza todo EOL con \n
ta;
- goto etiqueta a si el partido es exitoso
Tomado de mi blog.
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/'
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.
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'
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 )
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
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
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.
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.
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