convertir la sortie bash `ls` en tableau json

Est-il possible d’utiliser un script bash pour formater la sortie du ls en un tableau json? Pour être valide, tous les noms des répertoires et des fichiers doivent être mis entre guillemets, et l’intégralité des éléments doit être placée entre crochets. Ie 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 pure bash.

Utilisez perl comme encodeur; il est garanti qu’il est sans bogue, qu’il soit partout, et avec les pipes, il est toujours raisonnablement propre:

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

Oui, mais les boîtiers d’angle et le traitement Unicode vous conduiront au mur. Mieux vaut déléguer à un langage de script qui le supporte nativement.

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

Bonjour, vous pouvez le faire avec sed et awk:

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

EDIT: mis à jour pour résoudre le problème avec " et des espaces. J’utilise /@ comme modèle de remplacement pour " , puisque / n’est pas un caractère valide pour filename.

Si vous savez qu’aucun nom de fichier ne contient de nouvelles lignes, utilisez jq:

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

Brève explication des indicateurs à jq:

  • -R traite l’entrée comme une chaîne 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 ultérieure de jq. Essayez ceci si cela ne fonctionne pas pour vous:

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

Voici une ligne bash

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

Ne traitera pas correctement " , \ ou des virgules dans le nom du fichier. De même, si ls met des lignes entre les noms de fichiers, il en sera de même.

La plupart des machines Linux ont déjà python. Tout ce que tu dois faire est:

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

C’est pour . répertoire, vous pouvez append n’importe quel chemin.

Je cherchais également un moyen de générer une arborescence de dossiers / fichiers Linux vers un fichier JSON ou XML. Pourquoi ne pas utiliser cette commande de terminal simple:

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

Il suffit donc de la commande linux tree et de configurer vos propres parameters. Ici -X donne la sortie XML! Pour moi, ça va, et je suppose qu’il y a un script pour convertir XML en JSON.

NOTE: Je pense que cela couvre la même question.

Personnellement, je coderais le script qui exécuterait la commande ls, enverrais la sortie à un fichier de votre choix tout en analysant la sortie pour la formater à un format JSON valide.

Je suis sûr qu’un simple fichier Bash fera le travail.

Bash sortie

Vous ne pouvez pas utiliser un script python comme celui-ci?

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

Je n’ai pas vérifié 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']' 

puis lancez:

 $ ./ls2json.bash > json.out 

mais python serait encore plus facile

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