convertir la sortie bash `ls` en JSON array
est-il possible d'utiliser un script bash pour formater la sortie du ls
pour un tableau json? Pour être JSON valide, tous les noms des dirs et des fichiers doivent être enveloppés dans des guillemets doubles, séparés par une virgule, et la chose entière doit être enveloppé entre crochets. I. e. convertir:
jeroen@jeroen-ubuntu:~/Desktop$ ls
foo.txt bar baz
[ "foo.txt", "bar", "baz" ]
edit: je préfère fortement quelque chose qui fonctionne sur tous mes serveurs Linux; donc plutôt ne pas dépendre de python, mais avoir une solution de bash pure.
11 réponses
Utilisez perl comme encodeur; il est garanti d'être non-buggy, est partout, et avec des pipes, il est encore raisonnablement propre:
ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
Oui, mais les boîtiers de coin et la manipulation Unicode vous conduiront jusqu'au mur. Il est préférable de déléguer à un langage de script qui le supporte nativement.
$ ls
あ a "a" à a b 私
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]
Bonjour, vous pouvez le faire avec sed et awk:
ls | awk ' BEGIN { ORS = ""; print "["; } { print "\/\@""\/\@"; } END { print "]"; }' | sed "s^\"^\\\"^g;s^\/\@\/\@^\", \"^g;s^\/\@^\"^g"
EDIT: mise à jour pour résoudre le problème de l' "
et les espaces. J'utilise ", car /
n'est pas un caractère valide pour le nom de fichier.
si vous savez qu'aucun nom de fichier ne contient de newlines, utilisez jq:
ls | jq -R -s -c 'split("\n")'
Brève explication des drapeaux pour jq:
-R
traite l'entrée comme une chaîne de caractères au lieu de JSON-s
joint toutes les lignes dans un tableau-c
crée une sortie compacte
cela nécessite la version 1.4 ou plus récente de jq. Essayez ceci si cela ne fonctionne pas pour vous:
ls | jq -R '[.]' | jq -s -c 'add'
Voici un bash
echo '[' ; ls --format=commas|sed -e 's/^/\"/'|sed -e 's/,$/\",/'|sed -e 's/\([^,]\)$/\"\]/'|sed -e 's/, /\", \"/g'
ne pas traiter correctement "
,\
ou quelques virgules dans le nom du fichier. Aussi, si ls
met des lignes entre les noms de fichiers, ainsi que cela.
La plupart des machines Linux ont déjà python. tout ce que vous avez à faire c'est:
python -c 'import os, json; print json.dumps(os.listdir("/yourdirectory"))'
Ceci est pour . répertoire, vous pouvez ajouter n'importe quel chemin.
je cherchais aussi un moyen de sortir un arborescence de dossiers / fichiers Linux vers un fichier JSON ou XML. Pourquoi ne pas utiliser cette simple commande de terminal:
$ tree --dirsfirst --noreport -n -X -i -s -D -f -o my.xml
donc, juste la commande de l'arborescence linux, et configurez vos propres paramètres. Ici -X
donne une sortie XML! Pour moi, C'est OK, et je suppose qu'il y a un script pour convertir XML en JSON ..
personnellement, je coderais un script qui exécuterait la commande ls, enverrait la sortie à un fichier de votre choix tout en parsant la sortie pour la formater dans un format JSON valide.
je suis sûr qu'un simple fichier Bash fera l'affaire.
vous Pouvez pas utiliser un script python comme ça?
myOutput = subprocess.check_output["ls"]
output = ["+str(e)+" for e in myOutput]
return output
je n'ai pas vérifier si cela fonctionne, mais vous pouvez trouver la spécification ici
N'utilisez pas bash, utilisez un langage de script. Exemple de perl non testé:
use JSON;
my @ls_output = `ls`; ## probably better to use a perl module to do this, like DirHandle
print encode_json( @ls_output );
Devrait être assez facile.
$ cat ls2json.bash
#!/bin/bash
echo -n '['
for FILE in $(ls | sed -e 's/"/\"/g')
do
echo -n \"${FILE}\",
done
echo -en \b']'
lancer:
$ ./ls2json.bash > json.out
mais python serait encore plus facile
import os
directory = '/some/dir'
ls = os.listdir(directory)
dirstring = str(ls)
print dirstring.replace("'",'"')