Comment puis-je obtenir une liste non exhaustive de chemins récursifs d'une ligne par ligne?
Par exemple, je veux juste une liste à plat 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 dont j'ai besoin, mais je ne veux pas de fragments de chemin, je veux des chemins complets.
Si vous voulez vraiment utiliser ls
, alors 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 }'
Utilisez find:
find .
find /home/dreftymac
Si vous voulez uniquement des fichiers (omettez les répertoires, les périphériques, etc.):
find . -type f
find /home/dreftymac -type f
ls -ld $(find .)
si vous souhaitez trier votre sortie par date de modification:
ls -ltd $(find .)
Essayez la méthode la plus simple suivante:
find "$PWD"
La 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 uniquement les fichiers ASCII par exemple) avec deux while
name__s:
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. Cela m'a beaucoup aidé et finalement, j'ai créé le mien que je cherchais:
Pour répertorier tous les fichiers d’un répertoire et de ses sous-répertoires:
find "$PWD" -type f
Pour répertorier tous les répertoires d'un répertoire et de ses sous-répertoires:
find "$PWD" -type d
Pour répertorier tous les répertoires et fichiers d’un répertoire et de ses sous-répertoires:
find "$PWD"
Je ne connais pas le chemin complet, mais vous pouvez utiliser -R
pour la récursion. Alternativement, si vous n'êtes pas concentré sur ls
name__, vous pouvez simplement faire find *
.
En n'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 certaines coquilles d'appareils limitées où trouver/localiser ne sont pas disponibles.
trouver/fera l'affaire
Je pense que pour une liste plate, le meilleur moyen est:
find -D tree /fullpath/to-dir/
(ou pour l'enregistrer dans un fichier txt)
find -D tree /fullpath/to-dir/ > file.txt
Le moyen le plus simple pour tous vos futurs citoyens est tout simplement:
du
Cependant, cela montre aussi la taille de ce qui est contenu dans chaque dossier. Vous pouvez utiliser awk pour sortir uniquement le nom du dossier:
du | awk '{print $2}'
Edit- Désolé, désolé, mon mauvais. Je pensais que seuls les dossiers étaient nécessaires. Je vais laisser ça ici au cas où quelqu'un à l'avenir en aurait besoin de toute façon ...
Avec la liberté d'utiliser toutes les options possibles de ls:
find -type f | xargs ls -1
Ne compliquez pas les choses. Je viens de l'utiliser et j'ai une belle sortie:
ls -lR /path/I/need
Voici une réponse partielle qui montre les noms de répertoire.
ls -mR * | sed -n 's/://p'
Explication:
ls -mR *
liste les noms de répertoires complets se terminant par un ':', puis répertorie les fichiers de ce répertoire séparément
sed -n 's/://p'
trouve les lignes qui se terminent par un deux-points, élimine les deux points et les affiche
En parcourant la liste des répertoires, nous devrions également pouvoir les trouver. J'y travaille encore. C'est un défi d'obtenir les jokers par xargs.
Exécutez une commande bash au format suivant:
find /path -type f -exec ls -l \{\} \;
L'ajout d'un caractère générique à la fin d'un répertoire ls force les chemins d'accès 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 des répertoires récursifs, il se peut donc que ce ne soit pas la solution complète que vous recherchez.
ls -lR
est ce que vous cherchiez, ou du moins je l'étais. à votre santé
Je vois beaucoup de réponses. Ceci est le mien, et je pense très utile si vous travaillez sur Mac.
Je suis sûr que vous savez qu'il existe des fichiers "groupés" (. App, . Rtfd, . Workflow, etc.). Et en regardant dans la fenêtre du Finder, ils semblent être des fichiers uniques. Mais ils ne sont pas. Et $ ls
ou $ find
les voir comme des répertoires ... Donc, à moins que vous ayez besoin de lister leur contenu également, cela fonctionne pour moi:
find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"
Bien sûr, cela s’applique au répertoire de travail, et vous pouvez ajouter les extensions d’autres bundles (mais toujours avec un /
après celles-ci). Ou toute autre extension si ce n'est pas un paquet sans le /
.
Plutôt intéressant le ".lpdf/
" (pdf multilingue). Il a une extension ".pdf
" normale (!!) ou aucune dans le Finder. De cette façon, vous obtenez (ou il ne compte qu'un fichier) pour ce pdf
et pas un tas de choses…
Si le répertoire est passé en tant que chemin relatif et vous devrez le convertir en chemin absolu avant d'appeler find. Dans l'exemple suivant, le répertoire est passé en tant que premier paramètre au script:
#!/bin/bash
# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
tar cf - $PWD|tar tvf -
C'est lent mais fonctionne de manière récursive et imprime les répertoires et les fichiers. Vous pouvez le diriger avec awk/grep si vous voulez juste les noms de fichiers sans tous les autres répertoires info /:
tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"
@ ghostdog74: Little Tweak avec votre solution.
Le code suivant peut être utilisé pour rechercher un fichier avec son chemin absolu complet.
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 aussi le répertoire.
trouver $ PWD | nom de fichier fgrep
fonctionnait parfaitement sous Mac OS 10.12.1