Jak wyświetlić listę plików zaczynających się na „a” lub „c” z / etc. [Zamknięte]

10

Próbowałem, ls /etc/[ac]*ale pokazuje katalogi zaczynające się od a lub c i całą ich zawartość, a nie pliki zaczynające się od „ a ” lub „ c ”.

3df
źródło
katalogi są jednym z wielu rodzajów plików . Jakimi typami plików jesteś zainteresowany (zwykły, dowiązanie symboliczne, urządzenie, potok, gniazdo ...)?
Stéphane Chazelas
Nie jest jasne, czy przez „katalog” mówisz o zawartości katalogów, czy o samych nazwach katalogów. Polecenie, które wyświetlasz, wyświetlałoby zawartość katalogów pasujących do wzorca, a ls -d /etc/[ac]*Ty nie dostawałeś zawartości pasujących katalogów, ale nadal widziałeś nazwy katalogów. Nie jest jasne, czy to jest to, czego chcesz, czy chcesz uniknąć nawet wymieniania nazw katalogów.
Kusalananda

Odpowiedzi:

23

Aby uniknąć wyświetlania zawartości katalogów, możesz:

ls -d /etc/[ac]*

Spowoduje to wyświetlenie nazw katalogów wraz ze zwykłymi nazwami plików rozpoczynającymi się od alub c.

Dla kompletności rozwiązaniem niewymagającym findmoże być:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
Greg Hewgill
źródło
Moje pierwsze czytanie tego pytania również ls -dwydaje się odpowiednie, ale wydaje się, że pierwotne pytanie określa, że ​​nie należy wymieniać żadnych katalogów, niezależnie od rozszerzenia lub braku rozszerzenia.
Chris Down
1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9nie parsuj ls.
Avinash Raj
1
@AvinashRaj: Cóż, znaczenie tej porady zależy od tego, czy potrzebne jest to rozwiązanie, aby działać raz, czy na zawsze. Jeśli tylko raz, to parsowanie lsjest moim zdaniem uczciwą grą.
Greg Hewgill
3
On ma rację. Podczas gdy nazwy w /etcsą bardzo prawdopodobne, że są rozsądne, prosta spacja przerwie lspodejście, ponieważ numery pól się zmienią. +1 za ls -ldto.
terdon
1
Musisz także naprawić ustawienia narodowe ( LC_ALL=C), nie ma gwarancji, że w innych lokalizacjach będą 3 pola.
Stéphane Chazelas
7

Rekurencyjnie:

find /etc -type f -name '[ac]*'

Jeśli potrzebujesz braku rekursji, możesz to zrobić przenośnie:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Albo to, nieprzenośne (GNU lub ostatnie znalezisko BSD):

find /etc -type f -maxdepth 1 -name '[ac]*'

Jeśli chcesz to zrobić w sposób niewrażliwy, użyj -inamezamiast -name.

Chris Down
źródło
1
Uwaga: -type fdotyczy zwykłych plików . Jeśli zamiast tego potrzebujesz plików spoza katalogu, zamień na ! -type d(lub ! -xtype dGNU, findjeśli chcesz również wykluczyć dowiązania symboliczne do katalogów).
Stéphane Chazelas
1

Możesz spróbować tego polecenia również,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'
Avinash Raj
źródło
1

Jeśli chcesz zarówno katalogów (nie zawartości katalogu), jak i plików, możesz użyć printfbultin:

printf "%s\n" [ac]*

Przykład:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt
Cuonglm
źródło
Jak pozwoli to uniknąć katalogów, zgodnie z pytaniem w pytaniu?
Chris Down
Och, moje błędne odczytanie. Myślę, że OP chce katalogu, ale nie jego zawartości.
cuonglm
Przepraszam za tę edycję, całkowicie błędnie odczytana.
terdon
1

Brak rekurencji bez find:

ls -pd /etc/[ac]* | grep -v '/$'

-pdodaje /na koniec do katalogów, które grepfiltruje. Oczywiście nie działa w przypadku nazw plików zawierających znaki specjalne, takie jak znak nowej linii.

Anthon
źródło
1

Z zsh:

print -rl /etc/[ac]*(.)

Wyświetliłby listę zwykłych plików (jak w -type fin find), /etcktórych nazwa zaczyna się od alub c. (xxx)Część na końcu glob jest cechą specyficzną zsh nazywa globbing kwalifikator. .ponieważ kwalifikator globbing oznacza zwykły plik .

Jeśli glob nie pasuje, zshprzerwie polecenie. Zauważ, że w innych powłokach podobnych do Bourne'a, jeśli glob nie pasuje, wzorzec rozwija się do siebie, więc ls -d /etc/[ac]*może niepoprawnie wyświetlać plik wywoływany, /etc/[ac]*jeśli nie ma pliku rozpoczynającego się od alub cw /etc.

print -rl /etc/[ac]*(^/)

wyświetli listę plików, które nie są typu katalog i

print -rl /etc/[ac]*(-^/)

wyświetli listę plików, które nie są katalogami typu po rozwiązaniu dowiązań symbolicznych.

Stéphane Chazelas
źródło
-3

Dla wyświetlanych plików rozpoczynających się od:

ls etc |  grep ^a

Aby wyświetlić pliki zaczynające się na c:

ls etc |  grep ^c
Raj
źródło