Czy istnieje sposób, aby ls
wyświetlać tylko katalogi zamiast plików i katalogów?
Ze strony podręcznika:
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
Więc jeśli wpisuję go w /
katalogu, spodziewam się zobaczyć tylko katalogi. Zamiast tego pokazuje „.”
$ cd /
$ ls -d
.
Oczekiwałem, ls -d
że pokażę to:
$ ls -d
bin data home opt sbin sys var
boot dev lib media proc selinux tmp
cdrom etc lost+found mnt root srv usr
Czy istnieje sposób, aby ls
wyświetlać tylko katalogi zamiast plików i katalogów?
-d
nie oznacza tylko listy katalogów, oznacza to, że nie ma listy zawartości katalogu. Spróbuj wpisać,ls */
a zobaczysz zawartość wszystkich katalogów.ldir
alised sięls -d */
w moje.bashrc
, aby to ułatwić ...Odpowiedzi:
Twoje oczekiwania są oparte na DOS Think / Windows Think i są błędne. W MS-DOS, Windows i rzeczywiście w kilku innych systemach operacyjnych IBM / Microsoft, interpretacja symboli zastępczych odbywa się przez samą komendę, a
/a
opcje takie jak opcjadir
działają jako filtry atrybutów podczas ekspansji symboli zastępczych.dir
rozwija znaki wieloznaczne, takie jak*
, które interpreter poleceń przekazuje do niego w stanie, w jakim są, a jeśli/a
jest określony, stosuje odpowiednie filtry do zwracanych danych. (W niektórych systemach operacyjnych filtry atrybutów można nadać wywołaniu systemowemu w celu wyliczenia katalogu, a jądro systemu operacyjnego lub jego sterowniki systemu plików zastosują je same).W systemach Unices i Linux rozszerzanie symboli wieloznacznych odbywa się przez powłokę i nie zależy od uprawnień. Kiedy robisz to w katalogu głównym
to, co
ls
samo polecenie otrzymuje z powłoki (coś w stylu)Co
-d
/--directory
opcja robi to wyłączyć, co zwykle dzieje się dalej . To, co zwykle dzieje się potem, polega na tym, żels
analizuje kolejno każdy z argumentów, widzi, że są to katalogi i postanawia wyliczyć ich zawartość. W przypadku argumentów, które nazywają pliki, po prostu wypisuje informacje o samym pliku. Dzięki tej-d
opcji katalogi są traktowane jak pliki. Tak więcls
wypisuje informacje dla każdego z katalogów, które są przekazywane jako argumenty, tak jak zrobiłby to, gdyby były plikami.Nie
-d
jest to więc opcja „drukuj tylko katalogi”. W rzeczywistości nie tylko nie ma takiej opcji; nie może być takiej opcji. Rozwijanie symboli wieloznacznych odbywa się przez powłokę i (sh
przynajmniej w POSIX ) nie ma sposobu, aby powiedzieć powłoce, aby sprawdzała bity uprawnień i typów plików, gdy rozwija*
się do listy nazw. Aby uzyskać listę samych nazw katalogów, konieczne jest albo użyciefind
polecenia, jak wyjaśnionoztank1013
, lub użycie sztuczki, w której nazwa ścieżki kończąca się ukośnikiem oznacza pozycję katalogu.
, jak wyjaśniono przezJin
. (Jin
lewą kończy sięls
polecenie otrzymujące argumentyponieważ wzorzec
*/
w rzeczywistości dopasowuje nazwy ścieżek do dwóch składników, drugi jest pusty, a więc nie do końca robi to, co było pożądane. W szczególności potraktuje dowiązania symboliczne wskazujące katalogi tak, jakby były katalogami).Zachowanie
ls -d
bez a*
jest prostym rozszerzeniem powyższego. Trzeba tylko wiedzieć jeszcze jedną rzeczls
: Gdy nie podano żadnych argumentów, zakłada się domyślny argument.
. Teraz bez tej-d
opcji, wyżej wymienione przewody zachowanie do zawartości katalogu, nazwanych przez.
ich wyliczone, a informacje wyświetlane na jego zawartość. Dzięki tej-d
opcji katalog.
jest traktowany tak, jakby był plikiem, a wyświetlane są jego informacje, a nie ich zawartość.źródło
dir /s *.txt
[bez uciekania się do cytowania symboli wieloznacznych jak dla znalezienia]ls
może mieć opcję filtrowania plików lub katalogów, co nie wyklucza się wzajemnie w przypadku rozszerzenia powłoki. W ls nie ma warunków wyścigu: może je filtrować, gdy normalnie rejestruje pliki. (Istnieje już wyścig między rozszerzeniem powłoki a ls, FWIW.) Myślę, że rozszerzenie powłoki jest tylko częścią tego powodu: rozszerzenie powłoki (i ogólnie filtrowanie) nie jest zaimplementowane w ls, ponieważ musiałoby zostać zaimplementowane ponownie w cp , mv itp. Unix to „zrób jedną rzecz i zrób to dobrze”. Jeśli potrzebujesz zaawansowanego filtrowania, istnieją do tego narzędzia.ls -p
Opcja dodaje/
symbol tylko do katalogów. Nie ma powodu, aby nie rozszerzać możliwości drukowania wyjściowego o coś, co tylko je wyprowadza (a niels -p | grep /
).ls --only-directories .
opcję można wls
końcu dodać .Możesz użyć
ls -d */
lubls -d .*/
do ukrytych katalogów.źródło
Spróbuj tego
aby uzyskać tylko katalogi pod bieżącą lokalizacją.
źródło
Może ci się spodobać również
który starannie wyświetla wszystkie katalogi i podkatalogi z graficznym przedstawieniem struktury drzewa.
źródło
tree -dL 1
Jeśli chcesz zobaczyć katalogi tylko z
ls -l
opcją szczegółów takich jak (ELL), możesz użyć poniżej:Powyżej podasz tylko szczegóły, jakie otrzymujesz z
-l
opcją.źródło
find -maxdepth 1 -type d -exec ls -d {} +
aby uzyskać wyjście w zwykłymls
formacie.Jeśli chcesz wykonać zadanie w inny sposób, spróbuj tego:
ls -l | grep ^d
Chociaż w tej sytuacji wystarczy jedno narzędzie. Linia rur jest zawsze do Twojej dyspozycji. Podoba mi się elastyczność w Linuksie, której życzę.
źródło
Mam nadzieję, że to sprostuje twoją potrzebę. Poniższe polecenie wyświetli tylko katalogi w danej ścieżce.
Przykład:
źródło