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ć:
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.
@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.
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'
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.
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.
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.Odpowiedzi:
Aby uniknąć wyświetlania zawartości katalogów, możesz:
Spowoduje to wyświetlenie nazw katalogów wraz ze zwykłymi nazwami plików rozpoczynającymi się od
a
lubc
.Dla kompletności rozwiązaniem niewymagającym
find
może być:źródło
ls -d
wydaje 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.ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
nie parsujls
.ls
jest moim zdaniem uczciwą grą./etc
są bardzo prawdopodobne, że są rozsądne, prosta spacja przerwiels
podejście, ponieważ numery pól się zmienią. +1 zals -ld
to.LC_ALL=C
), nie ma gwarancji, że w innych lokalizacjach będą 3 pola.Rekurencyjnie:
Jeśli potrzebujesz braku rekursji, możesz to zrobić przenośnie:
Albo to, nieprzenośne (GNU lub ostatnie znalezisko BSD):
Jeśli chcesz to zrobić w sposób niewrażliwy, użyj
-iname
zamiast-name
.źródło
-type f
dotyczy zwykłych plików . Jeśli zamiast tego potrzebujesz plików spoza katalogu, zamień na! -type d
(lub! -xtype d
GNU,find
jeśli chcesz również wykluczyć dowiązania symboliczne do katalogów).Możesz spróbować tego polecenia również,
źródło
Jeśli chcesz zarówno katalogów (nie zawartości katalogu), jak i plików, możesz użyć
printf
bultin:Przykład:
źródło
Brak rekurencji bez
find
:-p
dodaje/
na koniec do katalogów, któregrep
filtruje. Oczywiście nie działa w przypadku nazw plików zawierających znaki specjalne, takie jak znak nowej linii.źródło
Z
zsh
:Wyświetliłby listę zwykłych plików (jak w
-type f
infind
),/etc
których nazwa zaczyna się oda
lubc
.(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,
zsh
przerwie polecenie. Zauważ, że w innych powłokach podobnych do Bourne'a, jeśli glob nie pasuje, wzorzec rozwija się do siebie, więcls -d /etc/[ac]*
może niepoprawnie wyświetlać plik wywoływany,/etc/[ac]*
jeśli nie ma pliku rozpoczynającego się oda
lubc
w/etc
.wyświetli listę plików, które nie są typu katalog i
wyświetli listę plików, które nie są katalogami typu po rozwiązaniu dowiązań symbolicznych.
źródło
Dla wyświetlanych plików rozpoczynających się od:
Aby wyświetlić pliki zaczynające się na c:
źródło