web-dev-qa-db-fra.com

Comment puis-je générer une liste de fichiers avec leur chemin absolu sous Linux?

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?

254
Ken

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.

257
Matthew Scharley
readlink -f filename 

donne le chemin absolu complet. mais si le fichier est un lien symbolique, vous obtiendrez le nom résolu final.

186
balki

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.

105
user431529

Vous pouvez utiliser

find $PWD 

en bash

25
Vinko Vrsalovic
ls -d "$PWD/"*

Cela ne concerne que le répertoire actuel. Il cite "$ PWD" s'il contient des espaces.

14
didi

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
7
GSM

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.

6
Gurpreet

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).

4
Trudius

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|\./||"
1
Mike Behr
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
1
rxw