wyświetlanie plików w katalogu bez wyświetlania podkatalogów i ich zawartości w tym katalogu

24

Chcę utworzyć listę wszystkich plików w katalogu, nie wymieniając żadnego z podkatalogów znajdujących się w tym samym katalogu, i wydrukować tę listę do nowego pliku.

ls -d * > filelist

utworzy listę wszystkich plików w bieżącym katalogu, ale wyświetli również podkatalogi w bieżącym katalogu. Wypróbowałem findpolecenie, używając -maxdepth 1opcji - jednak format wyjściowy jest problemem, ponieważ find również wypisuje ścieżkę wraz z nazwami plików.

Jeśli ktoś mógłby mi powiedzieć, może inne polecenie lub opcje, które utworzą listę wyjściową tylko plików w katalogu, a nie nazwy podkatalogów lub ich zawartości, byłbym wdzięczny.

Janet
źródło
2
Jestem zdezorientowany, wyświetlam ls -d *tylko pliki i foldery w bieżącym folderze, z wyjątkiem ukrytych plików / folderów tutaj;
GM-Script-Writer-62850
tak, ale nie chcę, aby foldery w tym katalogu były na liście, chcę tylko pliki w tym katalogu
Janet

Odpowiedzi:

22

Rozwiązanie oparte na znalezieniu:

find . -maxdepth 1 -type f -printf '%f\n'

Rozwiązanie oparte na Bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Rozwiązanie oparte na bash zapewni ci wszystko, co nie jest katalogiem; będzie zawierać rzeczy takie jak nazwane potoki (prawdopodobnie tego chcesz). Jeśli chcesz tylko pliki , użyj findpolecenia lub jednego z tych:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Jeśli zamierzasz używać tego regularnie, możesz oczywiście umieścić go w aliasie gdzieś w ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Ponieważ w komentarzach zauważyłeś, że faktycznie korzystasz z OSX, a nie Ubuntu, sugeruję, aby następnym razem kierować pytania do Apple lub bardziej ogólnych stron Unix i Linux Stack Exchange.

zła
źródło
1
Sprawdź, czy te rozwiązania są dla Ciebie odpowiednie na podstawie tego, czy chcesz dołączyć ukryte pliki.
Kevin Wheeler,
10

Pokaż tylko nazwy plików:

1. ls -p | grep -v / (bez ukrytych plików)
 2. ls -l | grep ^ - | tr -s '' | Wytnij -d '-f 9 (bez ukrytych plików)

 a) ls-pa | grep -v / (z ukrytymi plikami)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (z ukrytymi plikami)

Lista tylko katalogów:

1. ls -p | grep / (bez ukrytego)
 2. ls -l | grep ^ d | tr -s '' | Wytnij -d '-f 9 (bez ukrytego)

 a) ls-pa | grep / (z ukrytym)
 b) ls-l | grep ^ d | tr -s '' | cut -d '' -f 9 (z ukrytym)

grep -v -e ^ $ służy do usuwania pustych linii z wyniku.

Więcej szczegółów :
flaga ls -p umieszcza „/” na końcu nazwy katalogu, flaga -R służy do wyszukiwania rekurencyjnego, -l do wyświetlania informacji, -a do wyświetlania wszystkich informacji (w tym ukrytych plików), grep -v flaga służy do odwracania wyniku, a flaga -e do dopasowania wyrażenia regularnego.

Ananda
źródło
7

Aby wyświetlić tylko zwykłe pliki:

ls -al | grep ^-

Z dołączonymi symbolicznymi linkami:

ls -al | grep ^[-l]

Gdzie pierwszy znak listy opisuje typ pliku, -oznacza to, że jest to zwykły plik, ponieważ link symboliczny to l.

Debian / Ubuntu

Wydrukuj nazwy wszystkich pasujących plików (łącznie z linkami):

run-parts --list --regex . .

Z absolutnymi ścieżkami:

run-parts --list --regex . $PWD

Wydrukuj nazwy wszystkich plików, /etcktóre zaczynają się pi kończą na d:

run-parts --list --regex '^p.*d$' /etc
kenorb
źródło
5

Kolejne rozwiązanie, naiwnie krótkie, które dla mnie zadziałało:

ls -la | grep -E '^[^d]' > files
arsaKasra
źródło
idealny dla mnie,ls -alR |grep -E '^-'
tutaj
4

Sugerowałbym użyć find i po prostu usunąć nazwę katalogu z danych wyjściowych, jeśli to konieczne:

find . -type f -maxdepth 1 | sed s,^./,,
Puma
źródło
2
-maxdepth 1powinien pojawić się przed jakimkolwiek filtrem i możesz osiągnąć ten wynik bez korzystania sedz -printfopcji, tj .: find . -maxdepth 1 -type f -printf '%f\n'(będzie to bardziej wydajne niż używanie dodatkowego programu).
evilsoup
3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Inną możliwą opcją jest

ls -F | grep -v '/' | sed /[@*]$// > filelist

W --file-typekładzie / na koniec folderach (ale także o @ na koniec łączy symbolicznych. The grep -v '/'Usuwa podkatalogi (bo teraz kończyć się znakiem „/”). W sed s/@$//usuwa ten @. -1 drukuje jeden plik na linię tak aby grep -v działał poprawnie.

Dr.Tower
źródło
Dziękuję za odpowiedź. niestety nie działa dla mnie, być może wykonuję go niepoprawnie. jeśli użyję dokładnie tego polecenia, które mi podałeś, pojawia się następujący błąd: ls: niedozwolona opcja - - użycie: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [plik ...] próbowałem użyć znaku * zamiast znaku wieloznacznego w połączeniu z --file-type. jeśli możesz wyjaśnić, byłbym wdzięczny!
Janet
Polecenie działa dla mnie (z 13.04), jakiej wersji ubuntu używasz ?; -1nie ma znaczenia, aby grep nie był potrzebny; jeśli chcesz -als
dołączyć
właściwie pracuję na komputerze Mac. być może polecenie jest nieco inne na Mac OS X lub UNIX?
Janet
1
Możesz także spróbowaćls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower