Jak wykluczyć katalogi podczas wyświetlania plików?

21

Jak wykluczyć katalogi podczas wyświetlania plików w bieżącym katalogu?

ls .

^ uwzględni katalogi na liście.

Stephen Watkins
źródło

Odpowiedzi:

23

Spróbuj tego:

find . -maxdepth 1 -not -type d
Alexander Gladysh
źródło
3
upraszczaj: $ find. -type f
zablokował
9
Nie. (1) byłoby rekurencyjne, (2) nie wyświetlałoby dowiązań symbolicznych. @ Steve poprosił o ekwiwalent ls .bez katalogów - i oto jest.
Alexander Gladysh
2
Dodanie -lslub -exec ls -l {} \;sprawiłoby, że byłoby to ls -lbez katalogów.
Ladadadada,
15

Aby uzyskać dokładnie taką samą wartość, ls .nie musisz pokazywać ukrytych katalogów.

find . -maxdepth 1 -not -type d -and -not -name '.*'

i to wciąż pozostawia prefiks „./” do każdej nazwy pliku. To naprawdę nie jest problem, ale myślę, że to trochę brzydkie. Poszedłem z:

ls -p | grep -v '/$'

Dzięki temu otrzymasz listę, która wygląda tak samo i możesz dodać dodatkowe lsargumenty. Dodaj a, --color=alwaysa odzyskasz dircolors lub -azobaczysz ukryte pliki.

Podoba mi się odpowiedź Aleksandra, ponieważ tak naprawdę zależy on od systemu plików charakterystycznego dla danego pliku, więc nie da się go oszukać. Moja odpowiedź zostanie oszukana przez plik, który ma „/” jako ostatni znak w nazwie. Ale wygląda na to, że wymaga kłopotów.

Sean O'Leary
źródło
1
„-not” jest powiązany ze znalezieniem GNU, ponieważ nie jest zgodny z POSIX, lepiej nie uczyć tych opcji, ponieważ użytkownik może mieć „złe” nawyki i czuć się zagubiony na innych
UNIXACH
2
@JiriXichtkniha jaka jest alternatywa POSIX dla -not?
Lucas Gallindo
5

Spróbuj tego:

$ znajdź. -type f -maxdepth 1

albo to:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

zakleszczony
źródło
3

Chociaż jest to stary post, ale pomyślałem, że to może pomóc ...

$ ls -l | grep -v ^ d

Wyświetli listę wszystkich plików, w tym dowiązań symbolicznych, znaków i plików bloków.

sandeep.s85
źródło
Ta odpowiedź została już udzielona ponad rok wcześniej przez jamzed (powodując ten wizualny hałas.)
Alexx Roche
2

Powyższe rozwiązania „znajdź” tracą niektóre możliwości ls - na przykład: wyświetlaj tylko pliki, posortowane według malejącego czasu modyfikacji.

Odpowiedzi „ls -p | grep” nie zajmują się elegancko innymi elementami ls, takimi jak -R, gdyby były pożądane

Poniższa odpowiedź, choć bardziej szczegółowa, moim zdaniem odzwierciedla najprawdziwsze zachowanie ls i największą elastyczność w wybieraniu „tylko plików”

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Wystarczy wymienić przełączniki ls zgodnie z potrzebami, a wynik zostanie zwrócony tylko z plikami. Jeśli wymagane są również linki i inne elementy, należy przeprowadzić drobną przeróbkę testu w celu włączenia.

Pancho
źródło
0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Dzięki temu możesz nadal korzystać z innych opcji, które lszwykle biorą. Lub ... usuń, -vaby wyświetlić tylko katalogi. Lub ... zamień katalog na inny typ pliku, który filerozumie i raportuje, jak ASCII, pusty, ELF i tak dalej.

Kaulbach
źródło
Nie działa to, jeśli którakolwiek z nazw plików, które mają być wymienione, zawiera spacje.
Psychonauta,
ls -t .|while read f;do [ -f "$f" ]&& echo $f;donejest około 3 razy szybszy w moich testach
Alexx Roche
0

Byłem w systemie, w którym findplik binarny nie obsługiwał -noti skończyło się na użyciu:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Zalety: Nie polega na niczym innym niż sh ls echo
Jest kompatybilny z bash i myślnikiem
Można go zmienić, aby pasował do innych rzeczy (takich jak katalogi), zmieniając -f
Jest szybszy niż niektóre odpowiedzi i zużywa mniej pamięci RAM i procesora

Alexx Roche
źródło