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.