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 1opcji 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ę.
findna mac, nie ma ani -type, ani -maxdepthopcji.
-typei -maxdepthnie 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 funikanie ./przedrostka w nazwach plików wyjściowych; zwróć także uwagę na -maxdepthof 0, nie 1), o ile potrzebujesz tylko nazw plików w kolejności alfabetycznej . Jeśli chcesz, co lsmoż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 fodpowiedzią: 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, -Laby to zrobić.
ls -p | grep -v /
ls -p pozwala pokazać / po nazwie folderu, która działa jak znacznik do usunięcia.
lsopró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 findodpowiedź ( 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 lswielu opcji ;
również find niezmiennie znajduje ukryte elementy , podczas gdy ls„zachowanie zależy od obecności lub braku opcji -alub -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
lswielu innych opcji sortowania / formatu wyjściowego.Odpowiedź ls+grep Hansa Roggemana jest pragmatyczna, ale ogranicza cię do używania -lformatu 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 ,fpliki, dkatalogi i ldowiązania symboliczne przed listą lsargumentów (uruchom fls --helplub fls --mandowiedz 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 npmdział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, sudozależy od tego, jak zainstalowałeś Node.js / io.js i czy później zmieniłeś uprawnienia ; jeśli pojawi się EACCESbłąd, spróbuj ponownie z sudo.
-gZapewnia globalną instalację i jest potrzebne, aby umieścić flsw systemowym $PATH.
bashskrypt jako fls.chmod +x fls.$PATH, na przykład /usr/local/bin(macOS) lub /usr/bin(Linux).-1(numer jeden); lsw 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 /brobi, jeśli pamięć jest obsługiwana), użyj -1opcji, 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 lsopcji, na przykład:
-lużyj formatu długich list-tsortuj według czasu modyfikacji, najpierw najnowsze-rodwrotna kolejność podczas sortowania-F,--classifydołącz wskaźnik (jeden z * / => @ |) do wpisów-h,--human-readablez -l i -s, rozmiary wydruku, takie jak 1K 234M 2G itp ...
Czasami --colori 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/pathprzez .do listy do bieżącego katalogu lub ..do katalogu nadrzędnego .
Możesz również użyć lsz greplub egrepi 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, xargsaby działało, i używane -1zamiast -lpokazywać tylko nazwy plików bez dodatkowych lsinformacji
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.
lsnie czyta standardowego wejścia, więc potokowanie czegokolwiek do potoku jest bezcelowe ls. Tęskniłeś xargs?
findpolecenie w tej odpowiedzi jest całkowicie ignorowane ; ogólne polecenie jest takie samo jak ls -lt | less, które nie przeprowadza filtrowania typów.
findmożesz to zrobić find . -maxdepth 1 -type f -ls. Wydaje się również do pracy na Mac OS, chociaż wierzę, -maxdepthi -lsnie 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 echopoprawnie.