Rekurencyjnie wyświetla wszystkie pliki w katalogu, w tym pliki w katalogach dowiązań symbolicznych

147

Załóżmy, że mam katalogu /dir, wewnątrz której znajdują się 3 dowiązania do innych katalogów /dir/dir11, /dir/dir12oraz /dir/dir13. Chcę listę wszystkich plików w dirtym te w dir11, dir12i dir13.

Aby być bardziej ogólnym, chcę wymienić wszystkie pliki, w tym te w katalogach, które są dowiązaniami symbolicznymi. find ., ls -Ritp. zatrzymują się na dowiązaniu symbolicznym bez przechodzenia do nich w celu wyświetlenia dalszej listy.

CuriousDawg
źródło

Odpowiedzi:

232

-LOpcja lsbędzie osiągnąć to, co chcesz. Eliminuje dowiązania symboliczne.

Więc twoje polecenie byłoby następujące:

ls -LR

Możesz to również osiągnąć za pomocą

find -follow

Ta -followopcja kieruje find podążanie za symbolicznymi dowiązaniami do katalogów.

W systemie Mac OS X użyj

find -L

jak -followzostało wycofane.

Michael Ridley
źródło
14
-follow jest przestarzałe na rzecz -L w nowszych wersjach find.
pjz
@pjz: czy istnieje odniesienie do „-follow przestarzałe; użyć -L '? Nieco ku mojemu wielkiemu zdziwieniu, znalazłem '-L' i '-H' wymienione w standardzie POSIX / SUS na opengroup.org/onlinepubs/009695399/toc.htm , a jeszcze bardziej, ku memu zdziwieniu, brak '-follow', więc odpowiedziałem na własne pytanie.
Jonathan Leffler,
to nie zadziałało dla mnie. najpierw nic się nie stało, potem próbowałem -follow- i powiedziałem, że nie można znaleźć folderuollow
smatthewenglish
4
Na OS X 10.10 to działa: find -L .- Miałem ten sam problem co @ S.Matthew_English
fregante
Twoja odpowiedź jest dobra, ale chcę followtylko ścieżki do plików (pełna ścieżka do pliku), a nie ścieżka do katalogu, jak mam to zrobić?
Vicky Dev
116

A co z drzewem ? tree -lbędzie podążać za linkami symbolicznymi.

Zastrzeżenie : napisałem ten pakiet.

Steve Baker
źródło
2
A co z pakietem łukowym?
Mr_and_Mrs_D
To jest bardziej intuicyjny widok niż ls. Łatwiej jest też wkleić.
dhaupin
46
find /dir -type f -follow -print

-type f oznacza, że ​​wyświetli prawdziwe pliki (nie dowiązania symboliczne)

-follow oznacza, że ​​będzie podążał za dowiązaniami symbolicznymi do Twojego katalogu

-print spowoduje wyświetlenie nazw plików.

Jeśli chcesz mieć wyświetlacz typu ls, możesz wykonać następujące czynności

find /dir -type f -follow -print|xargs ls -l
dvorak
źródło
daje to ładniejszy obraz niż ls -Lopcja
eusoubrasileiro
10

Korzystanie ls:

  ls -LR

od „man ls”:

   -L, --dereference
          when showing file information for a symbolic link, show informa‐
          tion  for  the file the link references rather than for the link
          itself

Lub używając funkcji znajdź:

find -L .

Ze strony podręcznika wyszukiwania:

-L     Follow symbolic links.

Jeśli zauważysz, że chcesz podążać tylko za kilkoma dowiązaniami symbolicznymi (jak może tylko te z najwyższego poziomu, o których wspomniałeś), powinieneś spojrzeć na opcję -H, która podąża tylko za dowiązaniami symbolicznymi, które przekazujesz do niej w linii poleceń.

pjz
źródło
5

Wiedziałem, że treejest odpowiedni, ale nie mam zainstalowanego drzewa. Tak, mam dość blisko zastępcę tutaj

find ./ | sed -e 's/[^-][^\/]*\//--/g;s/--/ |-/'
divinedragon
źródło
To było dokładnie to, czego potrzebowałem. Dziękuję Ci.
Scott C
5
find -L /var/www/ -type l

# man find
-L     Follow  symbolic links.  When find examines or prints information about files, the information used shall be taken from the

właściwości pliku, na który wskazuje łącze, a nie samego odsyłacza (chyba że jest to zepsute dowiązanie symboliczne lub find nie może zbadać pliku, na który wskazuje łącze). Użycie tej opcji implikuje -noleaf. Jeśli później użyjesz opcji -P, -noleaf nadal będzie działać. Jeśli działa -L i find odnajdzie podczas wyszukiwania dowiązanie symboliczne do podkatalogu, przeszukany zostanie podkatalog wskazywany przez dowiązanie symboliczne.

Ashwin Muni
źródło
2
ls -R -L

-Lusuwa dowiązania symboliczne. Uniemożliwi to jednak wyświetlenie żadnych dowiązań symbolicznych do plików - będą one wyglądać jak wskazany plik.

Branan
źródło
-1

jeśli chcesz wydrukować całą zawartość pliku : find . -type f -exec cat {} +

qrtLs
źródło