Jak wyświetlić listę wszystkich plików w jednym folderze, ale bez ich folderów lub plików podrzędnych. Innymi słowy: jak mogę wyświetlić tylko pliki?
Jak wyświetlić listę wszystkich plików w jednym folderze, ale bez ich folderów lub plików podrzędnych. Innymi słowy: jak mogę wyświetlić tylko pliki?
Odpowiedzi:
Używając find
:
find . -maxdepth 1 -type f
Użycie tej -maxdepth 1
opcji zapewnia, że będziesz szukać tylko w bieżącym katalogu (lub, jeśli zastąpisz .
jakąś ścieżką, tym katalogu). Jeśli chcesz uzyskać pełną rekurencyjną listę wszystkich plików w tym i podkatalogach, po prostu usuń tę opcję.
find
na mac, nie ma ani -type
, ani -maxdepth
opcji.
-type
i -maxdepth
nie są opcjami w normalnym sensie; BSD find
(używane na OS X) nazywa je prawyborach , i muszą one pochodzić po nazwie pliku operandów (S) ( .
w tym przypadku; uwaga, że w przeciwieństwie na Linux, BSD potrzeby wersji przynajmniej jeden wyraźny filename operand); polecenie w tej odpowiedzi zdecydowanie działa na komputerze Mac.
find *.png -maxdepth 0 -type f
unikanie ./
przedrostka w nazwach plików wyjściowych; zwróć także uwagę na -maxdepth
of 0
, nie 1
), o ile potrzebujesz tylko nazw plików w kolejności alfabetycznej . Jeśli chcesz, co ls
można zrobić dla Ciebie w inny sposób (inny format wyjściowy / kolejność, bezpośrednia kontrola nad tym, czy ukryte elementy są uwzględnione, czy nie), uzupełnione o filtrowanie [wielu] typów, skrypt z mojej odpowiedzi może pomóc.
find * -maxdepth 0 -type f
(alternatywa wywodząca się z komentarza @ AlexHall) z find . -maxdepth 1 -type f
odpowiedzią: find . ...
niezmiennie zawiera ukryte elementy, niezmiennie przedrostki plików wyjściowych z ./
, aw przypadku GNU find
(Linux) zazwyczaj wyświetla nieposortowaną listę. find * ...
ze względu na zezwolenie powłoce na wykonanie globalizacji z góry, domyślnie wyklucza ukryte elementy (można to zmienić shopt -s dotglob
), wyświetla same nazwy plików (bez prefiksu), posortowane alfabetycznie. Żadne podejście nie obejmuje dowiązań symbolicznych do plików; użyj opcji, -L
aby to zrobić.
ls -p | grep -v /
ls -p pozwala pokazać / po nazwie folderu, która działa jak znacznik do usunięcia.
ls
oprócz find
, ponieważ ten ostatni zwraca ścieżki względne, a poprzednie tylko nazwy plików. Użyj odpowiedniego narzędzia do pracy.
Oparta na Carlpetcie find
odpowiedź ( find . -maxdepth 1 -type f
) działa w zasadzie, ale nie jest tym samym, co użycie ls
: otrzymujesz potencjalnie nieposortowaną listę nazw plików z prefiksami./
i tracisz możliwość zastosowania ls
wielu opcji ;
również find
niezmiennie znajduje ukryte elementy , podczas gdy ls
„zachowanie zależy od obecności lub braku opcji -a
lub -A
.
Poprawa , sugerowane przez Alex Hall w komentarzu na pytanie jest łączenie powłoki masek zfind
:
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
ls
wielu innych opcji sortowania / formatu wyjściowego.Odpowiedź ls
+grep
Hansa Roggemana jest pragmatyczna, ale ogranicza cię do używania -l
formatu wyjściowego long ( ) .
Aby rozwiązać te ograniczenia, napisałem narzędzie fls
( f iltering ls ) ,
ls
a jednocześnie zapewnia możliwość filtrowania typu ,f
pliki, d
katalogi i l
dowiązania symboliczne przed listą ls
argumentów (uruchom fls --help
lub fls --man
dowiedz się więcej).Przykłady:
fls f # list all files in current dir.
fls d -tA ~ # list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)
Obsługiwane platformy
Uwaga: Nawet jeśli nie używasz Node.js, jego menedżer pakietów npm
działa na różnych platformach i jest łatwy w instalacji; próbować
curl -L https://git.io/n-install | bash
Po zainstalowaniu Node.js zainstaluj w następujący sposób:
[sudo] npm install fls -g
Uwaga :
To, czy potrzebujesz, sudo
zależy od tego, jak zainstalowałeś Node.js / io.js i czy później zmieniłeś uprawnienia ; jeśli pojawi się EACCES
błąd, spróbuj ponownie z sudo
.
-g
Zapewnia globalną instalację i jest potrzebne, aby umieścić fls
w systemowym $PATH
.
bash
skrypt jako fls
.chmod +x fls
.$PATH
, na przykład /usr/local/bin
(macOS) lub /usr/bin
(Linux).-1
(numer jeden); ls
w rzeczywistości domyślnie jest to „gołe” wyjście, tj. tylko nazwy plików, ale podczas wysyłania do terminala używa układu opartego na kolumnach (wiele nazw plików w linii). Aby uzyskać jedną nazwę pliku na linię wyjściową (co dir /b
robi, jeśli pamięć jest obsługiwana), użyj -1
opcji, która jest w rzeczywistości włączona, gdy standardowe wyjście nie jest podłączone do terminala, na przykład podczas wysyłania do potoku lub pliku wyjściowego.
Lubię korzystać z ls
opcji, na przykład:
-l
użyj formatu długich list-t
sortuj według czasu modyfikacji, najpierw najnowsze-r
odwrotna kolejność podczas sortowania-F
,--classify
dołącz wskaźnik (jeden z * / => @ |) do wpisów-h
,--human-readable
z -l i -s, rozmiary wydruku, takie jak 1K 234M 2G itp ...
Czasami --color
i wszyscy inni. (Zobacz ls --help
)
Spowoduje to wyświetlenie plików, dowiązań symbolicznych, urządzeń, potoków, gniazd itp.
więc
find /some/path -maxdepth 1 ! -type d
można łatwo posortować według daty:
find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
lub
find /some/path -maxdepth 1 -type f
posortowane według rozmiaru:
find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Aby nie pokazywać ukrytych wpisów, których nazwa zaczyna się kropką, możesz dodać ! -name '.*'
:
find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
Następnie
Można zastąpić /some/path
przez .
do listy do bieżącego katalogu lub ..
do katalogu nadrzędnego .
Możesz również użyć ls
z grep
lub egrep
i umieścić go w swoim profilu jako alias:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
znajdź pliki: ls -l / home | grep "^ -" | tr -s '' | wytnij -d '' -f 9
znajdź katalogi: ls -l / home | grep "^ d" | tr -s '' | wytnij -d '' -f 9
znajdź linki: ls -l / home | grep "^ l" | tr -s '' | wytnij -d '' -f 9
tr -s '' zamienia dane wyjściowe w plik rozdzielany spacjami, a polecenie cut mówi, że separatorem jest spacja, i zwraca 9. pole (zawsze nazwa pliku / nazwa katalogu / nazwa dowiązania).
Używam tego cały czas!
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
dodane, xargs
aby działało, i używane -1
zamiast -l
pokazywać tylko nazwy plików bez dodatkowych ls
informacji
find -printf0 '...' | sort -z
Dodam tylko do odpowiedzi Carletta. Aby uzyskać bardzo użyteczny widok plików, możesz przesłać dane wyjściowe do ls.
find . -maxdepth 1 -type f|ls -lt|less
Pokazuje ostatnio zmodyfikowane pliki w formacie listy, co jest bardzo przydatne, gdy pobrałeś dużo plików i chcesz zobaczyć niezakłóconą wersję ostatnich.
ls
nie czyta standardowego wejścia, więc potokowanie czegokolwiek do potoku jest bezcelowe ls
. Tęskniłeś xargs
?
find
polecenie w tej odpowiedzi jest całkowicie ignorowane ; ogólne polecenie jest takie samo jak ls -lt | less
, które nie przeprowadza filtrowania typów.
find
możesz to zrobić find . -maxdepth 1 -type f -ls
. Wydaje się również do pracy na Mac OS, chociaż wierzę, -maxdepth
i -ls
nie są właściwie opcje przenośne.
"find '-maxdepth'" nie działa z moją starą wersją basha, dlatego używam:
dla f w $ (ls); zrób, jeśli [-f $ f]; następnie echo $ f; fi; Gotowe
for f in $(ls)
jest podwójnie błędne. Możesz to naprawić, for f in *
ale wtedy by się zepsuł, ponieważ nie cytujesz argumentu echo
poprawnie.