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.

19
demandé sur Jeroen 2012-04-19 22:19:51

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";'
12
répondu Dave 2012-04-19 19:23:02

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"]
16
répondu Ignacio Vazquez-Abrams 2012-04-19 18:28:21

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.

11
répondu Tronix117 2012-04-19 19:14:36

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'

10
répondu bowel 2015-09-03 21:06:10

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.

1
répondu Lou Franco 2012-04-19 18:35:50

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.

1
répondu Adeel Ahmad 2016-02-17 09:19:27

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 ..

REMARQUE: je pense que couvre la même question.

1
répondu Roelof Berkepeis 2018-07-25 14:57:00

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.

Bash sortie

0
répondu Erwald 2012-04-19 18:23:48

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

0
répondu DonCallisto 2012-04-19 18:28:51

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 );
-1
répondu gpojd 2012-04-19 18:41:04

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("'",'"')
-1
répondu TaoJoannes 2012-04-19 19:05:04