Comment puis-je générer une liste de fichiers avec leur chemin absolu sous Linux?
-
05-07-2019 - |
Question
J'écris un script shell qui prend les chemins d'accès aux fichiers en tant qu'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, la barre de fichier
a le chemin suivant:
/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 obligation é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?
La solution
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
au 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 souhaitez résoudre les liens symboliques. dans votre répertoire actuel.
Autres conseils
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/"**/
this 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
Dans bach, **
est récursif si vous activez shopt -s globstar
.
Vous pouvez utiliser
find $PWD
dans bash
ls -d "$PWD/"*
Ceci ne se trouve que dans le répertoire actuel . Il cite " $ PWD " au cas où il contient des espaces.
Le $ PWD
est une bonne option pour 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 seulement, 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 complété 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 par 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
)
Vous devriez obtenir:
/home/ken/foo/bar
Par conséquent, si vous voulez un ls -l
et le renvoyez le chemin absolu, vous pouvez simplement indiquer à la commande find d'exécuter un ls -l
quel que soit le résultat. trouve.
find /home/ken/foo -name bar -exec ls -l {} ;\
REMARQUE: il y a un espace entre {}
et ;
Vous obtiendrez quelque chose comme ceci:
-rw-r--r-- 1 ken admin 181 Jan 27 15:49 /home/ken/foo/bar
Si vous ne savez pas exactement 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 réellement 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 et Bash).
Commande: ls -1 -d "$ PWD /" *
Ceci 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
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
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 vous aidera:
find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
find / -print
le fera
ls -1 | awk -vpath=$PWD/ '{print path$1}'