Come elencare i file che iniziano con "a" o "c" da / etc. [chiuso]


10

Ho provato ls /etc/[ac]*ma mostra le directory che iniziano con a o c e il loro intero contenuto, non i file che iniziano con " a " o " c ".


le directory sono uno dei tanti tipi di file . A quali tipi di file sei interessato (normale, link simbolico, dispositivo, pipe, socket ...)?
Stéphane Chazelas,

Non è chiaro se tu per "directory" stai parlando del contenuto delle directory o dei nomi delle directory stesse. Il comando che mostrerai elenca il contenuto delle directory che corrispondono allo schema, con ls -d /etc/[ac]*te non otterrai il contenuto delle directory corrispondenti, ma vedresti comunque i nomi delle directory. Non è chiaro se questo è ciò che si desidera o se si desidera evitare di elencare anche i nomi delle directory.
Kusalananda

Risposte:


23

Per evitare di elencare i contenuti delle directory, è possibile:

ls -d /etc/[ac]*

Verranno elencati i nomi delle directory insieme ai normali nomi di file che iniziano con ao c.

Per completezza, una soluzione non coinvolgente findpotrebbe essere:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

Anche la mia lettura iniziale della domanda mi è ls -dsembrata appropriata, ma sembra che la domanda originale specifichi che nessuna directory dovrebbe essere elencata, indipendentemente dall'espansione o dalla non espansione.
Chris Down,

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9non analizzare ls.
Avinash Raj,

1
@AvinashRaj: Bene, la rilevanza di quel consiglio dipende dal fatto che una soluzione abbia bisogno per funzionare una volta o per sempre. Se solo una volta, l'analisi lsè un gioco leale secondo me.
Greg Hewgill

3
Ha un punto. Mentre i nomi in /etcsono molto probabilmente sani, uno spazio semplice romperà l' lsapproccio poiché i numeri dei campi cambieranno. +1 per ls -ldperò.
terdon

1
È inoltre necessario correggere le LC_ALL=Cimpostazioni internazionali ( ), non è garantito che la data contenga 3 campi in altre impostazioni locali.
Stéphane Chazelas,

7

ricorsivamente:

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

Se hai bisogno di non ricorsione, puoi farlo in modo portabile:

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

O questo, non portabile (GNU o una recente ricerca di BSD):

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

Se vuoi fare questo caso in modo insensibile, usa -inameinvece di -name.


1
Si noti che -type fè per file normali . Se invece hai bisogno di file non di directory, sostituiscili con ! -type d(o ! -xtype dcon GNU findse vuoi anche escludere collegamenti simbolici alle directory).
Stéphane Chazelas,

1

Puoi provare anche questo comando,

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'

1

Se vuoi sia le directory (non i contenuti della directory) sia i file, puoi usare printfbultin:

printf "%s\n" [ac]*

Esempio:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

Come si eviteranno le directory, come richiesto nella domanda?
Chris Down,

Oh, il mio fraintendimento. Penso che OP voglia una directory ma non il suo contenuto.
cuonglm,

Mi dispiace per quella modifica, completamente fraintesa.
terdon

1

Non ricorsivo senza find:

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

l' -paggiunge una /alla fine per le directory, che la grepfiltra fuori. Ovviamente non funziona con nomi di file che contengono caratteri speciali come newline.


1

Con zsh:

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

Elencherebbe i file regolari (come in -type fin find) elencati nel /etcnome che inizia con ao c. La (xxx)parte alla fine di un glob è una caratteristica specifica di zsh chiamata globbing qualifier. .come qualificatore globbing significa file regolare .

Se il glob non corrisponde, zshinterromperà il comando. Nota che in altre shell tipo Bourne, se il glob non corrisponde, il pattern si espande a se stesso, quindi ls -d /etc/[ac]*potrebbe erroneamente elencare un file chiamato /etc/[ac]*se non c'è nessun file che inizia con ao cin /etc.

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

elenca i file che non sono di tipo directory e

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

elenca i file che non sono di tipo directory dopo aver risolto i collegamenti simbolici.


-3

Per visualizzare i file che iniziano con un:

ls etc |  grep ^a

Per visualizzare i file che iniziano con c:

ls etc |  grep ^c
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.