J'écris un script shell qui prend les chemins de fichiers en entrée.
Pour cette raison, je dois générer des listes de fichiers récursifs avec des chemins d'accès complets. Par exemple, le fichier bar
a le chemin:
/home/ken/foo/bar
mais, pour autant que je puisse voir, les deux ls
et find
ne donnent que des listes de chemins relatifs:
./foo/bar (from the folder ken)
Cela semble être une exigence évidente, mais je ne vois rien dans les pages de manuel find
ou ls
.
Comment puis-je générer une liste de fichiers dans le shell, y compris leurs chemins absolus?
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Réponses:
Si vous donnez
find
un chemin absolu pour commencer, il imprimera des chemins absolus. Par exemple, pour rechercher tous les fichiers .htaccess dans le répertoire courant:ou si votre shell se développe
$PWD
dans le répertoire courant:find
ajoute simplement le chemin qui lui a été donné à un chemin relatif vers le fichier à partir de ce chemin.Greg Hewgill a également suggéré d'utiliser
pwd -P
si vous souhaitez résoudre les liens symboliques dans votre répertoire actuel.la source
pwd -P
.ls -d -1 $PWD/**/*
mais je suppose que celafind $PWD
fonctionne aussi (testé en bash)find $PWD
est simple. L'ls
incantation est complexe et lourde (à moins que vous ne l'aliasiez).find
ne dépend pas des expansions de glob de shell, donc fonctionnera dans n'importe quel shell.find
est également beaucoup plus flexible, je peux obtenir une liste récursive de tous les fichiers, ou peut-être de tous les répertoires, ou peut-être que je veux une liste de tous les fichiers xml, ou tous les fichiers modifiés au cours de la dernière semaine. Tout cela est possible avecfind
, mais pas facilement avecls
.find "`pwd`" -name .htaccess
cause des espaces dans les noms de répertoiresdonne le chemin absolu complet. mais si le fichier est un lien symbolique, vous obtiendrez le nom résolu final.
la source
realpath
plutôtbrew install coreutils
, alors l'exécutable sera installé en tant que/usr/local/opt/coreutils/libexec/gnubin/readlink
Utilisez ceci pour les répertoires (l'
/
after**
est nécessaire dans bash pour le limiter aux répertoires):ceci pour les fichiers et répertoires directement sous le répertoire courant, dont les noms contiennent un
.
:ceci pour tout:
Tiré d'ici http://www.zsh.org/mla/users/2002/msg00033.html
En bash,
**
est récursif si vous activezshopt -s globstar
.la source
Vous pouvez utiliser
en bash
la source
Cela ne regarde que dans le répertoire courant . Il cite "$ PWD" au cas où il contiendrait des espaces.
la source
Commander:
ls -1 -d "$PWD/"*
Cela donnera les chemins absolus du fichier comme ci-dessous.
la source
C'est
$PWD
une bonne option par Matthew ci-dessus. Si vous souhaitez rechercher uniquement pour imprimer des fichiers, vous pouvez également ajouter l'option -type f pour rechercher uniquement les fichiers normaux. Les autres options sont "d" pour les répertoires uniquement etc. Donc dans votre cas, ce serait (si je veux rechercher uniquement les fichiers avec .c ext):ou si vous voulez tous les fichiers:
Remarque: Vous ne pouvez pas créer d'alias pour la commande ci-dessus, car $ PWD est automatiquement complété dans votre répertoire personnel lorsque l'alias est défini par bash.
la source
Si vous donnez à la commande find un chemin absolu, elle crachera les résultats avec un chemin absolu. Donc, à partir du répertoire Ken si vous deviez taper:
(au lieu du chemin relatif
find . -name bar -print
)Tu devrais obtenir:
Par conséquent, si vous voulez un
ls -l
et qu'il renvoie le chemin absolu, vous pouvez simplement dire à la commande find d'exécuter unls -l
sur ce qu'il trouve.REMARQUE: il y a un espace entre
{}
et;
Vous obtiendrez quelque chose comme ceci:
Si vous n'êtes pas sûr de l'emplacement du fichier, vous pouvez toujours modifier l'emplacement de recherche. Tant que le chemin de recherche commence par "/", vous obtiendrez un chemin absolu en retour. Si vous recherchez un emplacement (comme /) où vous allez obtenir beaucoup d'erreurs d'autorisation refusée, je recommanderais de rediriger l'erreur standard afin que vous puissiez réellement voir les résultats de la recherche:
(
2>
est la syntaxe pour les shells Borne et Bash, mais ne fonctionnera pas avec le shell C. Cela peut aussi fonctionner dans d'autres shells, mais je sais seulement avec certitude que cela fonctionne dans Bourne et Bash).la source
ls
processus avec-exec ls -ld {} +
. (Vous voulez probablement ne-d
pas avoir lels
contenu du répertoire de la liste). Ou mieux, utilisez la fonction intégrée de findls
avecfind ... name bar -ls
. De plus, la syntaxe est incorrecte pour un argument par commande: vous devez citer le point-virgule à partir du shell, donc c'est le cas{} \;
.fd
En utilisant
fd
(alternative àfind
), utilisez la syntaxe suivante:Où
.
est le modèle de recherche etfoo
le répertoire racine.Par exemple , pour lister tous les fichiers dans
etc
récursive, exécutez:fd . /etc -a
.la source
Juste une alternative à
pour identifier qui
*
est l'expansion du shell, doncferait de même (l'inconvénient que vous ne pouvez pas utiliser
-1
pour séparer par de nouvelles lignes, pas par des espaces).la source
-1
pour séparer par lignes?la source
Voici un exemple qui imprime une liste sans période supplémentaire et qui montre également comment rechercher une correspondance de fichier. J'espère que cela t'aides:
la source
Cela a fonctionné pour moi. Mais il n'a pas été classé par ordre alphabétique.
Cette commande répertorie par ordre alphabétique et répertorie également les fichiers cachés.
la source
stat
Chemin absolu d'un seul fichier:
la source
Vous voudrez peut-être essayer ceci.
Vous pouvez obtenir le chemin abs en utilisant la
for
boucle etecho
simplement sansfind
.la source
Si vous avez besoin de la liste de tous les fichiers dans les répertoires actuels et sous-répertoires
Si vous avez besoin de la liste de tous les fichiers uniquement dans le répertoire actuel
la source
Cela donnera le chemin canonique (résoudra les liens symboliques):
realpath FILENAME
Si vous voulez un chemin canonique vers le lien symbolique lui-même, alors:
realpath -s FILENAME
la source
La plupart des méthodes suggérées, sinon toutes, entraînent des chemins qui ne peuvent pas être utilisés directement dans une autre commande de terminal si le chemin contient des espaces. Idéalement, les résultats auront des barres obliques ajoutées. Cela fonctionne pour moi sur macOS:
la source
find / -print
va faire çala source
la source