commande ls: comment puis-je obtenir un chemin complet récursive inscription, une ligne par fichier?

StackOverflow https://stackoverflow.com/questions/1767384

  •  21-09-2019
  •  | 
  •  

Question

Comment puis-je obtenir ls cracher sur une liste plate de chemins récursives une par ligne?

Par exemple, je veux juste une liste plate des fichiers avec leurs chemins complets:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 fait presque ce que je dois, mais je ne veux pas des fragments de chemin, je veux des chemins complets.

Était-ce utile?

La solution

Si vous voulez vraiment utiliser ls, puis formatez sa sortie en utilisant awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

Autres conseils

Utilisation trouver:

find .
find /home/dreftymac

Si vous voulez seulement (omettent les répertoires, périphériques, etc.):

find . -type f
find /home/dreftymac -type f

ls -ld $(find .)

si vous voulez trier votre sortie par date de modification:

ls -ltd $(find .)

Essayez ce qui suit de façon plus simple:

find "$PWD"

Meilleure commande est: tree -fi

Pour utiliser les fichiers, mais pas les liens, vous devez supprimer > de votre sortie:

tree -fi |grep -v \>

Si vous voulez connaître la nature de chaque fichier, (pour lire les fichiers ASCII par exemple) avec deux whiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

Oh, vraiment une longue liste de réponses. Il m'a beaucoup aidé et enfin, je créé mon propre que je cherchais:

Pour lister tous les fichiers dans un répertoire et ses sous-répertoires:

find "$PWD" -type f

Pour répertorier tous les répertoires dans un répertoire et ses sous-répertoires:

find "$PWD" -type d

Pour répertorier tous les répertoires et fichiers dans un répertoire et ses sous-répertoires:

find "$PWD"

Je ne sais pas sur le chemin complet, mais vous pouvez utiliser -R pour récursivité. Sinon, si vous n'êtes pas plié sur ls, vous pouvez juste faire find *.

En utilisant aucune commande externe autre que ls:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done

du -a

Pratique pour certains obus d'appareils limités où trouvent / localisent ne sont pas disponibles.

find / fera l'affaire

Je pense que pour une liste plate est la meilleure façon:

find -D tree /fullpath/to-dir/ 

(ou pour enregistrer dans un fichier txt)

find -D tree /fullpath/to-dir/ > file.txt

Ne pas faire compliqué. Je viens d'utiliser cela et a eu une belle sortie:

ls -lR /path/I/need

Le futur vous les gens est plus facile pour tout moyen simplement:

du

Cependant, montre aussi la taille de ce qui est contenu dans chaque dossier Vous pouvez utiliser awk pour une sortie seulement le nom du dossier:

du | awk '{print $2}'

Modifier- Désolé désolé, mon mauvais. Je pensais qu'il était seulement des dossiers qui étaient nécessaires. Ill laisser ce ici au cas où quelqu'un à l'avenir en a besoin de toute façon ...

Avec avoir la liberté d'utiliser toutes les options possibles ls:

find -type f | xargs ls -1

Exécuter une commande bash avec le format suivant:

find /path -type f -exec ls -l \{\} \;

Voici une réponse partielle qui indique le nom de répertoire.

ls -mR * | sed -n 's/://p'

Explication:

ls -mR * énumère les noms de répertoire complet se terminant par un « : », énumère ensuite séparément les fichiers dans ce répertoire

sed -n 's/://p' trouve les lignes qui se terminent par deux points, dépouiller le côlon et imprimer la ligne

Par itérer sur la liste des répertoires, nous devrions être en mesure de trouver les répertoires aussi bien. Workin toujours. Il est difficile d'obtenir les wildcards par xargs.

Ajout d'un caractère générique à la fin d'une des forces du répertoire ls chemins complets. En ce moment vous avez ceci:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Vous pouvez le faire à la place:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

Malheureusement, cela n'imprime pas le chemin complet pour les répertoires récursifs dans, donc il ne peut pas être la solution complète que vous cherchez.

ls -lR est ce que vous recherchez, ou du moins je l'étais. acclamations

Beaucoup de réponses que je vois. Ceci est à moi, et je pense très utile si vous travaillez sur Mac.

Je suis sûr que vous savez qu'il ya des fichiers "bundle" ( .app , .rtfd , .workflow , etc. ). Et en regardant la fenêtre du Finder, ils semblent simples fichiers. Mais ils ne sont pas. Et $ ls ou $ find les voient comme des répertoires ... Alors, à moins que vous avez besoin d'énumérer leur contenu aussi bien, cela fonctionne pour moi:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Bien sûr, cela est pour le répertoire de travail, et vous pouvez ajouter d'autres extensions de faisceaux (mais toujours avec un / après eux). Ou tout autre extensions sinon du bundle sans /.

Plutôt intéressant le ".lpdf/" (multilingue pdf). Il a la normale extension ".pdf" (!!) ou pas dans le Finder. De cette façon, vous obtenez (ou il compte seulement 1 fichier) pour cette pdf et non un tas de choses ...

Si le répertoire est passé comme un chemin relatif et vous aurez besoin pour le convertir en un chemin absolu avant d'appeler trouver. Dans l'exemple suivant, le répertoire est passé comme premier paramètre du script:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
tar cf - $PWD|tar tvf -             

Ceci est lent, mais fonctionne de manière récursive et imprime les répertoires et les fichiers. Vous pouvez diriger avec awk / grep si vous voulez juste les noms de fichiers sans tous les autres informations / répertoires:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

@ ghostdog74: Petit coup sec avec votre solution.
code suivant peut être utilisé pour rechercher le fichier avec son chemin absolu.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

Je connaissais le nom du fichier mais je voulais le répertoire.

trouver $ PWD | nom de fichier fgrep

a parfaitement fonctionné sous Mac OS 10.12.1

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top