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


Odpowiedzi:


15

Wypróbuj coś takiego:

find "$(cd ..; pwd)" -name "filename"

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.


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"


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.