Uzyskaj bezwzględną ścieżkę do plików za pomocą polecenia „znajdź”

26

Czy istnieje sposób uzyskania bezwzględnej ścieżki przeszukiwanego pliku?

Na przykład:

find .. -name "filename"

Daje mi wyniki, ../filenameale chcę pełną ścieżkę.

Muszę znaleźć w katalogu nadrzędnym i jego dzieciach dla określonego pliku, którego później użyję w innym skrypcie.

Dzięki

JorgeeFG
źródło

Odpowiedzi:

15

Wypróbuj coś takiego:

find "$(cd ..; pwd)" -name "filename"
Skrutator
źródło
Dzięki, właśnie testowałem $(cd ..; pwd). Tutaj działa OK, ale jeśli zrobię to sam w terminalu, nie mogę uzyskać katalogu nadrzędnego ... Dostaję „Bash: <katalog>: Jest katalogiem. A jeśli to zrobię $(cd ..; echo "something"), dostaję” coś: nie polecenie "
JorgeeFG
Czy masz na myśli oddzielne polecenie? Następnie należy pominąć znak dolara:(cd ..; pwd)
Skrutator
Dzięki, to było to. Wszelkie odniesienia do tego, dlaczego powinienem usunąć $, jak wpływa to na podpowłokę?
JorgeeFG
1
Tak ( ... )oznacza wykonanie w podpowłoce, dane wyjściowe są zapisywane na standardowe wyjście. $( ... )oznacza „podstawienie polecenia”. Ten ostatni może być używany tak, jakby był zmiennym rozszerzeniem.
Skrutinizer
znajdź / -nazwa „nazwa pliku”
Panther
12

Spróbuj użyć -execopcji find:

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

Uwaga: readlinkdrukuje wartość dowiązania symbolicznego lub kanonicznej nazwy pliku.

Sylvain Pineau
źródło
wywoła to readlink na każdym pliku, więc będzie bardzo nieskuteczne.
bac0n
9

Możesz użyć bashrozszerzenia tyldy, aby uzyskać ścieżkę bezwzględną do bieżącego katalogu roboczego, w ten sposób findwypisuje również ścieżkę bezwzględną dla wyników:

find ~+ -type f -name "filename"

Jeśli zostanie wykonany ~/Desktop, zostanie rozwinięty do

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

i drukuje wyniki takie jak:

/home/yourusername/Desktop/filename

Jeśli chcesz zastosować to podejście z katalogiem nadrzędnym bieżącego katalogu roboczego , musisz to zrobić cdprzed wywołaniem find:

cd .. && find ~+ -type f -name "filename"
deser
źródło
7

Najprostszy sposób to

find "$(pwd -P)" -name "filename"
Vivek
źródło
Tak! Lubfind `pwd -P` -name "filename"
Apollys obsługuje Monikę
znajdzie to pliki w bieżącym katalogu, a nie od rodzica.
bac0n
1

Również za pomocą PWD można wyświetlić pełny katalog. Pwd pokaże ci wszystkie twoje katalogi, w których się znajdujesz, jak rozszerzenie nazwy pliku. Mam nadzieję, że to pomogło.

Sir_Dippingsauce
źródło
1

To zadziałało dla mnie, ale zwróci tylko pierwsze wystąpienie.

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

Aby uzyskać pełne ścieżki dla wszystkich wystąpień (jak sugeruje Sergiy Kolodyazhnyy)

find . -type f -name filename | xargs realpath
Wyrmwood
źródło
Poprzedni komentarz usunięty, +1, dobra robota @Wyrmwood
Sergiy Kolodyazhnyy
1

Usuwanie ostatniego komponentu katalogu z parametrem Rozszerzenie .

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

Przykład wykorzystania pliku map do zapisania danych wyjściowych z find w tablicy indeksowanej do późniejszego wykorzystania.

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

(jeśli nie podano nazwy tablicy, MAPFILE będzie domyślną nazwą tablicy).

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
źródło