remove online from examples example array argjson linux json bash ubuntu sh

linux - online - convertir la salida de bash `ls` a json array



jq online (11)

¿No puedes usar un script de Python como este?

myOutput = subprocess.check_output["ls"] output = ["+str(e)+" for e in myOutput] return output

No verifiqué si funciona, pero puede encontrar la especificación here

¿Es posible usar un script bash para formatear la salida de ls a una matriz json? Para ser json válido, todos los nombres de los directorios y archivos deben estar entre comillas dobles, separados por una coma, y ​​todo debe estar entre corchetes. Es decir, convertir

jeroen@jeroen-ubuntu:~/Desktop$ ls foo.txt bar baz

a

[ "foo.txt", "bar", "baz" ]

edición: prefiero fuertemente algo que funcione en todos mis servidores Linux; por lo tanto, más bien no depende de python, pero tiene una solución de bash pura.


Aquí hay una línea de bash

echo ''['' ; ls --format=commas|sed -e ''s/^//"/''|sed -e ''s/,$//",/''|sed -e ''s//([^,]/)$//1/"/]/''|sed -e ''s/, //", /"/g''

No se manejará correctamente " , / o algunas comas en el nombre del archivo. Además, si ls pone nuevas líneas entre los nombres de archivo, esto también lo hará.


Debería ser bastante fácil.

$ cat ls2json.bash #!/bin/bash echo -n ''['' for FILE in $(ls | sed -e ''s/"///"/g'') do echo -n /"${FILE}/", done echo -en //b'']''

entonces corre:

$ ./ls2json.bash > json.out

pero Python sería aún más fácil

import os directory = ''/some/dir'' ls = os.listdir(directory) dirstring = str(ls) print dirstring.replace("''",''"'')


Hola, puedes hacer eso con sed y awk:

ls | awk '' BEGIN { ORS = ""; print "["; } { print "///@"$0"///@"; } END { print "]"; }'' | sed "s^/"^/////"^g;s^///@///@^/", /"^g;s^///@^/"^g"

EDIT: actualizado para resolver el problema con " y espacios. Utilizo /@ como patrón de reemplazo para " , ya que / no es un carácter válido para el nombre de archivo.


La mayor parte de la máquina Linux ya tiene python. todo lo que tienes que hacer es:

python -c ''import os, json; print json.dumps(os.listdir("/yourdirectory"))''

Esto es para . Directorio, puede agregar cualquier ruta.


No uses bash, usa un lenguaje de scripting. Ejemplo de Perl no probado:

use JSON; my @ls_output = `ls`; ## probably better to use a perl module to do this, like DirHandle print encode_json( @ls_output );


Personalmente, codificaría el script que ejecutaría el comando ls, enviaría la salida a un archivo de su elección mientras analizaba la salida para darle formato a un formato JSON válido.

Estoy seguro de que un simple archivo Bash hará el trabajo.

Bash ouput


Sí, pero los casos de esquina y el manejo de Unicode te llevarán a la pared. Mejor delegar a un lenguaje de scripting que lo soporte de forma nativa.

$ ls あ a "a" à a b 私 $ python -c ''import os, json; print json.dumps(os.listdir("."))'' ["/u00e0", "/"a/"", "/u79c1", "a b", "/u3042", "a"]


Si sabe que ningún nombre de archivo contiene nuevas líneas, use jq:

ls | jq -R -s -c ''split("/n")''

Breve explicación de las banderas a jq:

  • -R trata la entrada como una cadena en lugar de JSON
  • -s une todas las líneas en una matriz
  • -c crea una salida compacta

Esto requiere la versión 1.4 o posterior de jq. Intenta esto si no te funciona:

ls | jq -R ''[.]'' | jq -s -c ''add''


También estaba buscando una forma de generar una carpeta / árbol de archivos de Linux en algún archivo JSON o XML. ¿Por qué no usar este simple comando de terminal?

$ tree --dirsfirst --noreport -n -X -i -s -D -f -o my.xml

Entonces, solo el comando del árbol de Linux, y configure sus propios parámetros. Aquí -X da salida XML! Para mí, eso está bien, y supongo que hay un script para convertir XML a JSON ...

NOTA: Creo que this cubre la misma pregunta.


Usa perl como el codificador; se garantiza que no tiene buggy, está en todas partes y con tuberías, todavía está razonablemente limpio:

ls | perl -e ''use JSON; @in=grep(s//n$//, <>); print encode_json(/@in)."/n";''