Piszę skrypt powłoki, który pobiera ścieżki plików jako dane wejściowe.
Z tego powodu muszę wygenerować rekursywne listy plików z pełnymi ścieżkami. Na przykład plik bar
ma ścieżkę:
/home/ken/foo/bar
ale, o ile widzę, jak ls
i find
tylko dać względne ofert ścieżki:
./foo/bar (from the folder ken)
Wydaje się to oczywistym wymogiem, ale nic nie widzę na stronach podręcznika find
lub ls
.
Jak mogę wygenerować listę plików w powłoce wraz z ich bezwzględnymi ścieżkami?
linux
command-line
absolute-path
ls
Rozpoznać
źródło
źródło
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Odpowiedzi:
Jeśli podasz
find
bezwzględną ścieżkę na początek, wydrukuje ścieżki bezwzględne. Na przykład, aby znaleźć wszystkie pliki .htaccess w bieżącym katalogu:lub jeśli twoja powłoka rozwija
$PWD
się do bieżącego katalogu:find
po prostu wstawia ścieżkę, którą podano, do ścieżki względnej do pliku z tej ścieżki.Greg Hewgill zasugerował także użycie,
pwd -P
jeśli chcesz rozpoznać dowiązania symboliczne w bieżącym katalogu.źródło
pwd -P
.ls -d -1 $PWD/**/*
ale chybafind $PWD
działa również (przetestowana w bash)find $PWD
jest proste.ls
Zaklęcie jest złożona i nieporęczny (chyba, że go alias).find
nie zależy od rozszerzeń glob powłoki, więc będzie działać w dowolnej powłoce.find
jest również o wiele bardziej elastyczny, mogę uzyskać rekursywną listę wszystkich plików, a może wszystkich katalogów, a może chcę listę wszystkich plików xml lub wszystkich plików zmienionych w ostatnim tygodniu. Wszystko to jest możliwefind
, ale niełatwels
.find "`pwd`" -name .htaccess
ze względu na spacje w nazwach katalogówdaje pełną ścieżkę absolutną. ale jeśli plik jest dowiązaniem symbolicznym, otrzymasz ostateczną rozstrzygniętą nazwę.
źródło
realpath
zamiast tegobrew install coreutils
, plik wykonywalny zostanie zainstalowany jako/usr/local/opt/coreutils/libexec/gnubin/readlink
Użyj tego dla katalogów (
/
po**
bash potrzebne jest ograniczenie, aby ograniczyć je do katalogów):dotyczy to plików i katalogów bezpośrednio w bieżącym katalogu, których nazwy zawierają
.
:to na wszystko:
Pobrano stąd http://www.zsh.org/mla/users/2002/msg00033.html
W bash
**
jest rekurencyjny, jeśli włączyszshopt -s globstar
.źródło
Możesz użyć
w bash
źródło
Wygląda to tylko w bieżącym katalogu. Cytuje „$ PWD”, jeśli zawiera spacje.
źródło
Komenda:
ls -1 -d "$PWD/"*
To da absolutne ścieżki do pliku jak poniżej.
źródło
$PWD
Jest dobrym rozwiązaniem przez Mateusza powyżej. Jeśli chcesz znaleźć tylko pliki do wydrukowania, możesz także dodać opcję -type f, aby przeszukiwać tylko normalne pliki. Inne opcje to „d” tylko dla katalogów itp. W twoim przypadku byłoby to (jeśli chcę wyszukiwać tylko pliki z rozszerzeniem .c):lub jeśli chcesz wszystkie pliki:
Uwaga: Nie można utworzyć aliasu dla powyższego polecenia, ponieważ $ PWD jest automatycznie uzupełniane do katalogu domowego, gdy alias jest ustawiany przez bash.
źródło
Jeśli podasz polecenie find bezwzględną ścieżkę, wypluje wyniki z bezwzględną ścieżką. Więc z katalogu Kena, jeśli chcesz wpisać:
(zamiast ścieżki względnej
find . -name bar -print
)Powinieneś wziąć:
Dlatego, jeśli chcesz
ls -l
i zwraca on ścieżkę bezwzględną, możesz po prostu powiedzieć komendzie find, aby wykonała poleceniels -l
cokolwiek znajdzie.UWAGA: Odstęp między
{}
i;
Otrzymasz coś takiego:
Jeśli nie masz pewności, gdzie jest plik, zawsze możesz zmienić lokalizację wyszukiwania. Tak długo, jak ścieżka wyszukiwania zaczyna się od „/”, w zamian otrzymasz ścieżkę bezwzględną. Jeśli szukasz lokalizacji (np. /), W której pojawi się wiele błędów odmowy uprawnień, zalecamy przekierowanie błędu standardowego, abyś mógł zobaczyć wyniki wyszukiwania:
(
2>
to składnia dla powłok Borne i Bash, ale nie będzie działać z powłoką C. Może działać również w innych powłokach, ale wiem tylko na pewno, że działa w Bourne i Bash).źródło
ls
procesu za pomocą-exec ls -ld {} +
. (Prawdopodobnie nie chcesz-d
miećls
zawartości katalogu listy). Albo lepiej, znaleźć zastosowanie wbudowanego wls
zfind ... name bar -ls
. Ponadto masz niepoprawną składnię dla jednego argumentu na polecenie: musisz zacytować średnik z powłoki, więc tak{} \;
.fd
Korzystając z
fd
(alternatywniefind
), użyj następującej składni:Gdzie
.
jest wzorzec wyszukiwania ifoo
katalog główny.Np do listy wszystkich plików w
etc
rekursywnie, uruchom:fd . /etc -a
.źródło
Po prostu alternatywa dla
aby wskazać, że
*
jest to rozszerzenie powłoki, więczrobiłby to samo (wada, której nie można użyć
-1
do oddzielenia przez nowe wiersze, a nie spacje).źródło
-1
z separete po liniach?źródło
Oto przykład, który drukuje listę bez dodatkowego okresu, a także pokazuje, jak wyszukać dopasowanie pliku. Mam nadzieję że to pomoże:
źródło
To zadziałało dla mnie. Ale nie było w porządku alfabetycznym.
To polecenie wyświetla listę alfabetycznie, a także wyświetla ukryte pliki.
źródło
stat
Bezwzględna ścieżka jednego pliku:
źródło
Możesz spróbować tego.
Możesz uzyskać ścieżkę abs za pomocą
for
pętli iecho
po prostu bezfind
.źródło
Jeśli potrzebujesz listy wszystkich plików w bieżącym, a także w podkatalogach
Jeśli potrzebujesz listy wszystkich plików tylko w bieżącym katalogu
źródło
To da ścieżkę kanoniczną (rozwiąże dowiązania symboliczne):
realpath FILENAME
Jeśli chcesz kanoniczną ścieżkę do samego dowiązania symbolicznego, to:
realpath -s FILENAME
źródło
Większość, jeśli nie wszystkie sugerowane metody, dają ścieżki, których nie można użyć bezpośrednio w innym poleceniu terminalu, jeśli ścieżka zawiera spacje. Idealnie byłoby, gdyby wyniki zawierały ukośniki. Działa to dla mnie na macOS:
źródło
find / -print
zrobi toźródło
źródło