Ls -l peut-il être fait pour séparer les champs avec des tabulations plutôt que des espaces pour rendre la sortie utile dans une feuille de calcul?

10

Comment la sortie de ls -lpeut -elle être modifiée pour séparer les champs en utilisant des tabulations au lieu d'espaces? Je veux coller la sortie dans une feuille de calcul; le rembourrage avec un nombre variable d'espaces le rend difficile à faire. Pour illustrer:

racine racine de drwxr-xr-x 2 4096 26 sept. 11:43 wpa_supplicant
-rw-r ----- 1 numérotation root 66 26 septembre 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 8 octobre 08:21 X11
drwxr-xr-x 12 root root 4096 18 févr 23:31 xdg
drwxr-xr-x 2 root root 4096 31 janvier 06:11 xml
drwxr-xr-x 2 root root 4096 22 novembre 07:26 xul-ext
-rw-r - r-- 1 racine root 349 13 janvier 2012 zsh_command_not_found

Dans l'extrait ls -l /etcci-dessus, les lignes 1, 2 et 3 ont un seul chiffre dans la colonne 2 tandis que la ligne 4 en a deux. Cela signifie que l'alignement est réalisé en utilisant deux espaces pour séparer les colonnes 1 et 2 dans les lignes 1-3, mais un seul espace dans la ligne 4.


la source

Réponses:

3

J'ai fait un script shell pour le même. Il prend en charge les cas où les noms de fichiers ont des espaces ou tout autre caractère spécial.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
pour fichier en $ (ls)
faire
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ file
    mod_epoch = $ (stat --format = "% Y" $ file)
    mod_month = $ (date -d @ $ mod_epoch + "% b")
    mod_day = $ (date -d @ $ mod_epoch + "% d")
    mod_time = $ (date -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ fichier
terminé
IFS = $ SAVEIFS
  • Enregistrez-le dans un fichier, par exemple ls_tab.sh
  • Rendez-le exécutable:
chmod + x ls_tab.sh
  • Exécuter:
./ls_tab.sh

Remarque: Cela peut être fait en analysant la sortie de ls, cependant la raison pour laquelle cela ne devrait pas être fait est donnée ici .

vert
la source
1
Si le but est de savoir ce qui est lsdit , l'analyse de sa sortie est correcte. C'est rarement l'objectif. On peut dire que c'est ici. Je pense que la méthode que vous avez utilisée est assez bonne (toute méthode produira des résultats indésirables compte tenu de certains besoins)! Cependant, l'analyse syntaxique lspourrait être meilleure. Prenons le cas d'un nom de fichier qui contient en fait un caractère de tabulation. ls -lremplace l'onglet par un ?caractère. Votre script conserve le caractère de tabulation, qui créera des colonnes supplémentaires si sa sortie est interprétée comme délimitée par des tabulations et utilisée pour créer une feuille de calcul. Il se dégrade gravement si un nom de fichier a une nouvelle ligne.
Eliah Kagan
1
Vrai. Mais normalement, les fichiers n'ont pas \nou \tdans leurs noms. S'ils le font, l'analyse de la sortie de lsavec des commandes bash simples sera plus complexe, mais peut être réalisée. Je peux mettre à jour la réponse, si le PO souhaite gérer de tels cas.
vert
Cela fonctionne pour moi et les longs noms de fichiers avec des espaces en eux s'affichent correctement. Mon utilisation est assez simple et j'espère ne pas traiter les fichiers avec \net \ten leur nom.
1
Parfait. Pour la feuille de calcul Windows, utilisez printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $fileet pour rediriger la sortie du fichier en tant que ./ls_tab.sh > listing.txt.
Fedir RYKHTIK
6

Essayer:

ls -l | awk -v OFS="\t" '$1=$1'

Ou, si vos noms de fichiers ont des espaces:

ls -l | awk '{print $1,"\t",$2,"\t",$3,"\t",$4,"\t",$5,"\t",$6,"\t",$7,"\t",$8,"\t",$9,$10,$11,$12,$13,$14,$15;}'
philshem
la source
+1. Marche parfaitement. Ce genre de chose est précisément à cela awk. Intelligent!
tgies
Malheureusement, cela ne fonctionne pas correctement pour les noms de fichiers contenant des espaces. Il les remplace également par des onglets. Bien que cela soit plus simple et s'exécute plus rapidement que la solution basée sur un script de green7 , cela produira une sortie incorrecte une grande partie du temps et n'a aucun avantage sur la méthode d'Aditya . Peut-on le modifier pour que les espaces ne soient plus interprétés comme des délimiteurs d'entrée, après la 9ème colonne?
Eliah Kagan
1
veuillez voir la mise à jour
philshem
@ psny18 La façon mise à jour est encore plus gravement cassée. Il coupe tout sauf le premier mot de chaque nom de fichier. La simple écriture $9ne change pas le fait que vous avez awktoujours interprété les espaces comme indiquant une rupture entre les colonnes. $9capture uniquement le premier mot dans cette position, et puisque les autres mots sont considérés comme des colonnes distinctes et de numéro supérieur, ils ne sont jamais imprimés du tout.
Eliah Kagan
C'est dommage que les noms de fichiers ne soient pas traités comme une seule colonne même s'ils contiennent des espaces.
1

Nous n'avons même pas besoin de convertir la sortie en tant que tabulé. L'espace entre les colonnes est juste assez fin.

Exécutez votre ls -lcommande dans le terminal comme vous le faites normalement et copiez le contenu que vous souhaitez coller dans une feuille de calcul.

commande de terminal

Ensuite, ouvrez votre programme Spreadsheet (LibreOffice Calc dans mon cas) et appuyez sur Ctrl+ Vpour coller le contenu de votre presse-papiers.

L'assistant d'importation de texte apparaîtra. Assurez-vous de mettre une coche à côté Spaceet appuyez sur Ok. Vous pouvez regarder l'aperçu dans le volet inférieur.

Importation de texte Libo

Aditya
la source
1
Cela ne fonctionnera pas lorsque les noms de fichiers ont des espaces
vert
@ green7: Ah .. Je ne m'en suis pas rendu compte! :-)
Aditya
Pas seulement les noms de fichiers mais aussi le nombre de caractères dans les colonnes. Le remplissage ici et ailleurs pose problème si "espace" est choisi comme délimiteur. Je vais modifier la question pour illustrer cela.
0

python est bon pour cela:

# python
import os

os.system( 'ls -lR --time-style=full-iso /home/jw > ls_dump.txt')

folder = ''

for line in open('ls_dump.txt', 'r'):

    inrec = line.split()

    if inrec == []:
        continue

    if inrec[0].startswith('total'):
        continue

    if inrec[0].endswith(':'):
        folder = inrec[0].replace(':','')
        continue

    outline = folder + '\t' + '\t'.join(inrec[0:8]) +'\t'+ ' '.join(inrec[8:]) 

    print( outline )
JWest
la source