Mogę użyć, ls -ld */
aby wyświetlić listę wszystkich pozycji katalogu w bieżącym katalogu. Czy istnieje podobnie prosty sposób, aby po prostu wyświetlić listę wszystkich zwykłych plików w bieżącym katalogu? Wiem, że mogę użyć find
find . -maxdepth 1 -type f
lub stat
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
ale nie wydają mi się zbyt eleganckie. Czy istnieje przyjemny, krótki sposób, aby wyświetlić tylko zwykłe pliki (nie dbam o urządzenia, potoki itp.), Ale nie podkatalogi bieżącego katalogu? Lista linków symbolicznych również byłaby plusem, ale nie jest koniecznością.
find
polecenie jest najlepszym sposobem na robienie tego, co chcesz. Aby uzyskać pewne niezawodne inne opcje, powinieneś przyjrzeć się poleceniom specyficznym dla powłoki (a te nie są przenośne)!ls -d */
, co jest krótkie, łatwe do pisania i łatwe do zrozumienia. Jestem więc bardzo zadowolony z odpowiedzi Ulricha Dangela, mimo że nie używam zsh.Odpowiedzi:
Za pomocą
zsh
i Glob Qualifiers możesz łatwo wyrazić to bezpośrednio, np .:zwróci tylko listę zwykłych plików lub błąd w zależności od konfiguracji.
W przypadku katalogów innych niż katalogi:
(będzie zawierać dowiązania symboliczne (w tym do katalogów), nazwane potoki, urządzenia, gniazda, drzwi ...)
dla zwykłych plików i dowiązań symbolicznych do zwykłych plików.
dla nie-katalogów i bez dowiązań symbolicznych do katalogów.
Zobacz także
D
kwalifikator globbing, jeśli chcesz dołączyć pliki D ot (pliki ukryte), takie jak*(D-.)
.źródło
To polecenie wyświetla listę wszystkich nie ukrytych plików, które nie są katalogami (zwykłe pliki, łącza, pliki urządzeń itp.). Aby dołączyć także ukryte pliki, dodaj
-A
opcję dols
Zakłada, że żaden z plików nie ma w nazwie znaków nowej linii. Dodanie
-q
opcjils
przekształciłoby wszystkie niedrukowalne znaki, w tym znak nowej linii?
, gwarantując, że znajdują się one w jednej linii, i dlatego są odpowiednie do podawania do narzędzia opartego na linii, takiego jakgrep
i do drukowania na terminalu.źródło
--color=always
dols
OSX-G
.sudo chmod 777
na końcu i dostałem błędy ... Każda pomoc jest bardzo milels -pL | grep -v /
. Dodano-L
dereferencje dowiązań symbolicznych.ls -pdL something* | grep -v /
. Dodana-d
opcja wyświetla same katalogi, a nie ich zawartość, więc zostaną one poprawnie wykluczone.Aby wyświetlić tylko zwykłe pliki:
Z dołączonymi symbolicznymi linkami (do dowolnego typu pliku):
Gdzie pierwszy znak listy opisuje typ pliku,
-
oznacza to, że jest to zwykły plik, ponieważ link symboliczny tol
.Debian / Ubuntu
Wydrukuj nazwy wszystkich pasujących plików (łącznie z linkami):
Z absolutnymi ścieżkami:
Wydrukuj nazwy wszystkich plików,
/etc
które zaczynają sięp
i kończą nad
:źródło
ls
nie ma takiej możliwości, ale jedną z fajnych rzeczy w unixie i linuksie jest to, że długie i nieeleganckie potoki można łatwo przekształcić w skrypt powłoki, funkcję lub alias. a te z kolei mogą być używane w rurociągach, jak każdy inny program.(UWAGA: istnieją pewne problemy z zakresem funkcji i aliasów. Skrypty są dostępne dla każdego pliku wykonywalnego, który może je odczytać i wykonać. Aliasy i funkcje są dostępne tylko w bieżącej powłoce - chociaż plik .profile / .bashrc itp. Pod-powłoki może zmienić definicję i tym samym udostępnić je. Ponadto skrypt może być napisany w dowolnym języku - w tym bash / sh, awk, perl, python i inne - w zależności od tego, który z nich jest najlepszy do pracy lub z którego jesteś najbardziej zaznajomiony)
na przykład
alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'
Dodałem xargs, abyś mógł korzystać ze wszystkich zwykłych
ls
opcji, nplsf -lrS
Ponieważ używa
find
, wszystkie normalnie ukryte pliki kropkowe zostaną wyświetlone, a wszystkie nazwy plików będą poprzedzone ./ - to jedyna różnica, którą zauważysz.Możesz wykluczyć pliki kropkowe,
! -iname '.*'
ale wtedy będziesz musiał mieć dwie wersje aliasu - jedną, która wyświetlała pliki kropkowe, a drugą nie.alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'
Alternatywnie, jeśli
lsf
byłby to skrypt zamiast aliasu, można przeanalizować opcje (być może z getopts lub / usr / bin / getopt lub podobnym) i wykluczyć pliki dot, chyba że-a
były obecne.źródło
-name
wystarczy, nie potrzebujesz-iname
.Opcja -F do ls dołącza * do plików wykonywalnych, / do katalogów, @ do dowiązań symbolicznych, = do gniazd i | do FIFO. Następnie możesz użyć grep, aby wykluczyć nietypowe znaki pliku z pliku wyjściowego i masz pliki. Działa to w dowolnej powłoce, nie tylko w Zsh.
Słabe strony to:
@
,=
lub|
zostaną wyłączone (ale nie należy naprawdę mieć pliki z tych znaków w nazwie i tak)źródło
=
,@
lub|
znaki.=
jest powszechny w maildir lub nazwach plików, które mają część kodowaną base64 lub cytowaną do wydrukowania.@
w definicjach ustawień regionalnych, dla adresów e-mail i nie tylko. Jednak rzadko pojawiają się na końcu nazwy pliku. (na przykład tylko 31 z 2,2 miliona w tym systemie)W instrukcji podano, że opcja „f” dotyczy tylko „zwykłego pliku”, a nie rur, gniazd ani urządzeń blokowych / char, co oznacza, że już robisz właściwe rzeczy.
źródło
Nie jest to szczególnie krótkie, ale możesz zmienić go w skrypt lub alias, jeśli chcesz szybko go wywołać. Używając polecenia ls jako tablicy wejściowej, wywołaj ls -ld na każdym wpisie potokowanym do grep, aby wykluczyć katalogi z danymi wyjściowymi wysłanymi do null, a jeśli powiodą się echo oryginalnego wejścia:
Możesz odwrócić grep i wyjście warunkowe, te same wyniki:
źródło
\dev\null
?!?!To nieco stary wątek, ale najczystszy sposób na wyświetlanie tylko plików.
źródło
touch "some file name"
zobaczyć szybki kontrprzykładls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'
, powinien obsługiwać pliki ze spacjami.