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.
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";''