Mam katalog, w którym chciałbym wyświetlić całą zawartość (pliki i podkatalogi) bez pokazywania dowiązań symbolicznych. Korzystam z narzędzi GNU w systemie Linux. ls
Wersja to 8.13.
Przykład:
Pełna lista katalogów:
~/test$ ls -Gg
total 12
drwxrwxr-x 2 4096 Jul 9 10:29 dir1
drwxrwxr-x 2 4096 Jul 9 10:29 dir2
drwxrwxr-x 2 4096 Jul 9 10:29 dir3
-rw-rw-r-- 1 0 Jul 9 10:29 file1
-rw-rw-r-- 1 0 Jul 9 10:29 file2
lrwxrwxrwx 1 5 Jul 9 10:29 link1 -> link1
lrwxrwxrwx 1 5 Jul 9 10:30 link2 -> link2
Co chciałbym dostać
~/test$ ls -somthing (or bash hack)
total 12
dir1 dir2 dir3 file1 file2
UWAGA: Moją główną motywacją jest wykonanie rekurencyjnego grepa (GNU grep 2.10) bez następujących dowiązań symbolicznych.
grep
(patrz ostatni akapit).grep -H
, jeśli go masz (patrzman grep
), lub w inny sposób,grep 'pat' '{}' /dev/null ';'
aby oszukać, że istnieje wiele plików, jeśli nie masz.+
nie spełnia tego wymagania w przypadku zdegenerowanym, w którym na końcu pozostaje tylko jeden plik lub jeden plik.Lub prościej:
Wyjaśnienie
ls -l
oznacza listę w długiej formie . Gdy to zrobisz, pierwszy ciąg znaków podaje informacje o każdym pliku. Pierwszy znak wskazuje, jakiego typu jest każdy plik. Jeśli jest to dowiązanie symboliczne,l
to pierwszy znak to an .grep -v ^l
oznacza odfiltrowanie (-v
) linii rozpoczynających się od (^
) anl
.źródło
for i in
-l
wls
. To nie zadziałałoby zgodnie z oczekiwaniami:ls | grep -v ^l
find
, patrz unix.stackexchange.com/questions/321697Począwszy od wersji 2.12,
-r
opcja dla GNU grep nie wyklucza dowiązań symbolicznych, chyba że podasz je ręcznie:źródło
-R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option.
w 2.10W Zsh byłoby to łatwe dzięki globalnym kwalifikatorom :
Wzorzec
**/
rekurencyjnie przechodzi do podkatalogów. Kwalifikator glob.
ogranicza dopasowanie do zwykłych plików.Bez zsh użyj
find
(patrz odpowiedź Michaela Hornera ). W tym konkretnym przypadku GNU grep może robić, co chcesz (dokładnie togrep -r
robi) - ale tylko od wersji 2.12 wcześniejsze wersje korzystały z dowiązań symbolicznych.źródło
Możesz użyć
$LS_COLORS
do tego. Jeśli twoja wersjals
obsługuje określanie kolorów za pomocą tej zmiennej, możesz zdefiniować dane wyjściowe według typu pliku. Jest to wbudowane zachowanie i bardzo konfigurowalne. Więc stworzyłem kilka plików do pokazania:Więc teraz zrobię:
A nulls też tam są ...
Możesz określić dla wszystkich lub dowolnych typów plików. Robi to tylko w przypadku pojedynczego typu pliku, ale nie jest to pożądane, ponieważ
ls
wprowadzono pewne domyślne wartości kompilacji dla ucieczek terminali. O wiele lepiej byłoby zająć się interfejsem API jako pojedynczym interfejsem. Oto prosty mały sposób analizowania i przypisywania wartościdircolors
domyślnych skonfigurowanych w bieżącym środowisku :Jego wynik w moim katalogu domowym wygląda następująco:
Możesz to również uruchomić,
cat -A
a jedyną różnicą, jaką możesz napotkać, jest to, że zobaczysz$
nowe wiersze - nie ma znaków, które nie można wydrukować, wprowadzonych przezls --color=always
w tej konfiguracji - tylko to, co widzisz tutaj.ls
wstawia domyślny znak ucieczki terminala w ten sposób:... gdzie wartości domyślne
$lc
(po lewej stronie kodu) ,$rc
(po prawej stronie kodu) i$rs
(reset) to:...odpowiednio.
${type_code}
służy do zastępowania różnychfi
(zwykły plik - domyślnie nieuzbrojony) ,di
(katalog) ,ln
(link) i każdego innego typu pliku, jaki znam. Istnieje również$no
(normalny), który jest domyślnie nieuzbrojony i który jest tutaj reprezentowany przez//
na początku każdej linii. Mój prosty małyIFS=:
blok działa po prostu przez wstawienie nazwy dla każdego konfigurowalnego jako własnej wartości i dodanie ukośnika lub dwóch - chociaż\0
NUL bajtów też by to zrobiło.Domyślnie
ls
wstawi również jedno$rs
bezpośrednio poprzedzające jego pierwsze wyjście$lc
- ale nie jest to tutaj dokładnie przedstawione. W tym przypadku podałem$ec
(kod końcowy), który jest oznaczony$rs
we wszystkich przypadkach - gdy jest określony, nie dostaniesz dodatkowego$rs
pomiędzy,$no
a${type_code}
tak jak by to było inaczej - przedstawia tylko bezpośrednio po nazwie pliku i raz na początku wyjścia - jak widać w jednym dodatkowym ukośniku na początku pierwszej linii.Oto fragment mojego własnego
$LS_COLORS
I prawdę mówiąc, mój mały hack z powłoki jest prawdopodobnie zbyt skomplikowany - istnieje powszechnie dostępny interfejs do przypisywania tych wartości. Spróbuj
dircolors -p
w swoim cli iinfo dircolors
uzyskać więcej informacji na ten temat.Możesz zawijać nazwy plików w dowolne ciągi. Możesz je skomentować, jeśli chcesz. Możesz określić podobne zachowania na podstawie tylko rozszerzenia pliku. Tak naprawdę nie ma tak wielu rzeczy, których nie można określić.
Teraz nie tylko wymyślam to wszystko - dowiedziałem się o tym po przypadkowym natknięciu się na kod źródłowy .
Dzięki tej konkretnej konfiguracji
ls
wyemituje:$no
- raz na rekord na początku każdego rekordu${type_code}
- jednokrotnie bezpośrednio poprzedzający każdą nazwę pliku, zawierającą skrót typu pliku i zawsze występujący w tym samym wierszu i 7 polach oddzielonych spacjami po$no
lub bezpośrednio po->
oznaczeniu celu dowiązania symbolicznego.$ec
- raz bezpośrednio przed pierwszym wierszem, a następnie tylko raz bezpośrednio po każdej nazwie pliku.Wszystkie pozostałe wartości są puste.
To, co następuje, jest rozdzielone znakiem null
ls
, i tym razem skorzystamcat -A
, ale bez niego wyglądałoby to tak samo jak w poprzednim przykładzie:Aby więc niezawodnie usunąć wszystkie dowiązania symboliczne z
-l
listy ong, takiej jak ta, możesz wprowadzić prostą zmianę:Moje wyniki po uruchomieniu wyglądają jak ...
Za pomocą polecenia podobnego do powyższego:
... (gdzie
fc1
i gdziefc2
typy plików są wymienioneset --
w dalszej części podpowłoki) powinny służyć do niezawodnego usuwania dowolnych kombinacji typów plików, które mogą być potrzebne,ls
bez względu na znaki, które nazwy plików mogą zawierać.źródło
lc
,nc
itp są?ls
„sdi=
wartości. Musisz dodaćdi=:
do var, aby to anulować - i dla wszystkich innych. Mam na myśli interfejs API - adresujesz każdy typ pliku, ale musisz za każdym razem adresować ten sam interfejs. Więc ustawienieln
jednej drogi i zignorowaniedi
wartości domyślnych nie zadziała. Istnieje również wiele domyślnych ustawień ... Hmm. Twoje pytanie olc
inc
i rzeczy jest ważna - całkowicie - Już to zrobiłem to na drugi dzień chociaż. Myślę, że połączę to.dircolors
. Czyta plik konfiguracyjny i wyświetlaeval
przyjazną dla powłoki wartość var. To całkiem proste - ale jest też kilka linii tam. W każdym razie, jeśli chcesz go użyćdircolors
, po prostu zapisz dwa różne pliki i wywołaj go w ten sposób. Pokazałem ci też, jak postępować jednocześnie z\0
ogranicznikami NUL w ramach każdej sekwencji ucieczki.LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$( set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex; for fc do printf %s "$fc=/$fc//\0:"; done) ls -l --color=always | cat -A
Powyższa odpowiedź prowadzi do:
Co dziwne, pozostawienie 1 poza poleceniem ls wciąż daje listę.
źródło
grep -i
? To nie tak, że/
może być wielkie lub małe litery.ls
domyślnie jest to format kolumny noe, gdy wyjście nie jest terminalem (tutaj jest potok).Spróbuj tego:
źródło
a -> b
. Nie powiedzie się również w nazwach plików z nowymi liniami i innych dziwnościach. Przeczytaj to, dlaczego parsowanie ls jest złym pomysłem.ls
jest aliasowanels -l
, a to zwraca kolumny przed nazwą pliku, albo nie jest, i to nie robi nic specjalnego w dowiązaniach symbolicznych.ls
analizuje się. wszyscy parsujemy zals
każdym razem, gdy drukujemy do terminala - jest interfejs API . Tutaj zamieściłem odpowiedź pokazującą coś takiego - ale możesz zrobić znacznie więcej. Pokazałem ci innego dnia - sam miałeś nazwy plików z ogranicznikami.ls
nie zje twoich dzieci ani nic takiego - to tylko program. Jeśli nie to wyjaśnić to będzie wziąć kilkaset to wyjaśnić i kilkaset więcej, aby wyjaśnić, dlaczego kilkaset wierszy po prostu związane są błędne. A poza tym - to tylko dwie linie:LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \ ls -1 --color=always | cat
Wypróbuj to polecenie:
ls -p | grep -v @
źródło
find -type f
-p
po prostu dodaje ukośnik do katalogów, szukasz-F
ii) Twojafind
alternatywa nie będzie lista katalogów oraz iii) Proszę sprawdzić swoje odpowiedzi przed wysłaniem wiadomości.