Obtenez le chemin absolu des fichiers en utilisant la commande 'find'

26

Existe-t-il un moyen d'obtenir le chemin absolu d'un fichier recherché?

Par exemple:

find .. -name "filename"

Cela me donne des résultats comme ../filenamemais je veux le chemin complet.

Ce dont j'ai besoin, c'est de trouver dans le répertoire parent et ses enfants, pour un fichier spécifique, que j'utiliserai plus tard dans un autre script.

Merci

JorgeeFG
la source
1
Question similaire sur SO .
Glutanimate le

Réponses:

15

Essayez quelque chose comme:

find "$(cd ..; pwd)" -name "filename"
Scrutinisateur
la source
Merci, je testais juste $(cd ..; pwd). Ici, cela fonctionne bien, mais si je le fais seul dans un terminal, je ne peux pas obtenir le répertoire parent ... Je reçois "Bash: <rép>: est un répertoire. Et si je le fais, $(cd ..; echo "something")je reçois" quelque chose: pas un command "
JorgeeFG
Voulez-vous dire comme une commande distincte? Ensuite, vous devez supprimer le signe dollar:(cd ..; pwd)
Scrutinizer
Merci, c'était tout. Toute référence expliquant pourquoi devrais-je supprimer le $, comment cela affecte-t-il le sous-shell?
JorgeeFG
1
Oui ( ... )signifie exécuter dans un sous-shell, la sortie est écrite dans stdout. $( ... )signifie "substitution de commande". Ce dernier peut être utilisé comme s'il s'agissait d'une expansion variable.
Scrutinizer
find / -name "filename"
Panther
12

Essayez d'utiliser l' -execoption de find:

find .. -name "filename" -exec readlink -f {} \;

Remarque: readlinkimprime la valeur d'un lien symbolique ou d'un nom de fichier canonique.

Sylvain Pineau
la source
cela appellera readlink sur chaque fichier, ce sera donc très inefficace.
bac0n
9

Vous pouvez utiliser bashl'extension Tilde de pour obtenir le chemin absolu du répertoire de travail en cours, de cette façon, findimprime également le chemin absolu pour les résultats:

find ~+ -type f -name "filename"

S'il est exécuté en ~/Desktop, il est étendu à

find /home/yourusername/Desktop -type f -name "filename"

et imprime des résultats comme:

/home/yourusername/Desktop/filename

Si vous souhaitez utiliser cette approche avec le répertoire parent du répertoire de travail actuel, vous devez le faire cdavant d'appeler find:

cd .. && find ~+ -type f -name "filename"
dessert
la source
7

Le moyen le plus simple est

find "$(pwd -P)" -name "filename"
Vivek
la source
Oui! Oufind `pwd -P` -name "filename"
Apollys prend en charge Monica
cela trouvera des fichiers dans le répertoire courant pas du parent.
bac0n
1

L'utilisation de PWD peut également vous montrer le répertoire complet. Pwd vous montrera tous vos répertoires dans lesquels vous vous trouvez, comme l'extension du nom de fichier. J'espère que cela vous a aidé.

Sir_Dippingsauce
la source
1

Cela a fonctionné pour moi, mais ne retournera que la première occurrence.

realpath $(find . -type f -name filename -print -quit)

Pour obtenir des chemins complets pour toutes les occurrences (comme suggéré par Sergiy Kolodyazhnyy)

find . -type f -name filename | xargs realpath
Bois de wyrm
la source
Commentaire précédent supprimé, +1, bon travail @Wyrmwood
Sergiy Kolodyazhnyy
1

Suppression du dernier composant de répertoire avec le paramètre Expansion .

find "${PWD%/*}" -name 'filename'

Un exemple de la façon dont vous pouvez utiliser mapfile pour enregistrer la sortie de find dans un tableau indexé pour une utilisation ultérieure.

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(si aucun nom de tableau n'est spécifié, MAPFILE sera le nom de tableau par défaut).

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
la source