J'écris un script Shell qui prend les chemins de fichier en entrée.
Pour cette raison, je dois générer des listes de fichiers récursives avec des chemins d'accès complets. Par exemple, le fichier bar
a le chemin:
/home/ken/foo/bar
mais, autant que je sache, ls
et find
ne donnent que des listes de chemins relatifs:
./foo/bar (from the folder ken)
Cela semble une nécessité évidente, mais je ne vois rien dans les pages de manuel find
ou ls
.
Comment générer une liste de fichiers dans le shell, y compris leurs chemins absolus?
Si vous donnez à find
un chemin absolu pour commencer, les chemins absolus seront imprimés. Par exemple, pour rechercher tous les fichiers .htaccess dans le répertoire actuel:
find "$(pwd)" -name .htaccess
ou si votre Shell étend $PWD
dans le répertoire actuel:
find "$PWD" -name .htaccess
find
ajoute simplement le chemin qui lui a été attribué à un chemin relatif au fichier à partir de ce chemin.
Greg Hewgill a également suggéré d'utiliser pwd -P
si vous voulez résoudre les liens symboliques dans votre répertoire actuel.
readlink -f filename
donne le chemin absolu complet. mais si le fichier est un lien symbolique, vous obtiendrez le nom résolu final.
Utilisez ceci pour les répertoires (le /
après **
est nécessaire dans bash pour le limiter aux répertoires):
ls -d -1 "$PWD/"**/
ceci pour les fichiers et les répertoires directement sous le répertoire en cours, dont les noms contiennent un .
:
ls -d -1 "$PWD/"*.*
ceci pour tout:
ls -d -1 "$PWD/"**/*
Tiré d'ici http://www.zsh.org/mla/users/2002/msg00033.html
En bash, **
est récursif si vous activez shopt -s globstar
.
Vous pouvez utiliser
find $PWD
en bash
ls -d "$PWD/"*
Cela ne concerne que le répertoire actuel. Il cite "$ PWD" s'il contient des espaces.
Commande:ls -1 -d "$PWD/"*
Cela donnera les chemins absolus du fichier comme ci-dessous.
[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
Le $PWD
est une bonne option de Matthew ci-dessus. Si vous souhaitez trouver uniquement les fichiers à imprimer, vous pouvez également ajouter l'option -type f pour ne rechercher que les fichiers normaux. Les autres options sont "d" pour les répertoires uniquement, etc. Ainsi, dans votre cas, ce serait (si je veux rechercher uniquement les fichiers avec l'extension .c ext):
find $PWD -type f -name "*.c"
ou si vous voulez tous les fichiers:
find $PWD -type f
Remarque: vous ne pouvez pas créer d'alias pour la commande ci-dessus, car $ PWD est automatiquement renseigné dans votre répertoire personnel lorsque l'alias est défini par bash.
Si vous donnez à la commande find un chemin absolu, les résultats seront recrutés avec un chemin absolu. Donc, à partir du répertoire Ken si vous deviez taper:
find /home/ken/foo/ -name bar -print
(au lieu du chemin relatif find . -name bar -print
)
Tu devrais obtenir:
/home/ken/foo/bar
Par conséquent, si vous voulez un ls -l
et que celui-ci renvoie le chemin absolu, vous pouvez simplement indiquer à la commande find d'exécuter un ls -l
sur tout ce qu'il trouve.
find /home/ken/foo -name bar -exec ls -l {} ;\
NOTE: Il y a un espace entre {}
et ;
Vous obtiendrez quelque chose comme ça:
-rw-r--r-- 1 ken admin 181 Jan 27 15:49 /home/ken/foo/bar
Si vous ne savez pas où se trouve le fichier, vous pouvez toujours modifier l'emplacement de la recherche. Tant que le chemin de recherche commence par "/", vous obtiendrez un chemin absolu en retour. Si vous recherchez un emplacement (comme /) où vous obtiendrez de nombreuses erreurs d'autorisation refusée, je vous recommande de rediriger l'erreur standard afin que vous puissiez voir les résultats de la recherche:
find / -name bar -exec ls -l {} ;\ 2> /dev/null
(2>
est la syntaxe des shells Borne et Bash, mais ne fonctionnera pas avec le shell C. Cela peut également fonctionner dans d'autres shells, mais je sais seulement avec certitude que cela fonctionne dans Bourne and Bash).
Voici un exemple qui imprime une liste sans période supplémentaire et qui explique également comment rechercher une correspondance de fichier. J'espère que cela t'aides:
find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }