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?

Était-ce utile?

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}'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top