Qual è l'equivalente Linux del "nome file dir / s / b" di DOS?


17

Elenca tutti i file / directory all'interno o sotto la directory corrente che corrispondono a "nome file".

Risposte:


28

L'equivalente diretto è

find . -iname <filename>

che elencherà tutti i file e le directory chiamati <filename>nella directory corrente e tutte le sottodirectory, ignorando il caso.

Se la tua versione di find non supporta -iname, puoi -nameinvece utilizzare . Si noti che a differenza di -iname, -nameè sensibile al maiuscolo / minuscolo.

Se si desidera elencare solo i file chiamati <filename>e non le directory, aggiungere-type f

find . -iname <filename> -type f

Se si desidera utilizzare i caratteri jolly, è necessario inserire virgolette intorno, ad es

find . -iname "*.txt" -type f

altrimenti la shell lo espanderà.

Come altri hanno sottolineato, puoi anche fare:

find . | grep "\.txt$"

grep stamperà linee basate su espressioni regolari, che sono più potenti dei caratteri jolly, ma hanno una sintassi diversa.

Vedi man finde man grepper maggiori dettagli.


3
Se <filename>contiene caratteri jolly, utilizzare le virgolette intorno, ad es find . -name '*.txt'.
Gilles 'SO- smetti di essere malvagio' il

@Gilles, ho aggiornato la mia risposta per dirlo, grazie.
Mikel,

2
L'uso <filename>come marker per l'inserimento dell'utente è una cattiva abitudine nell'ambiente della riga di comando, dove la < and >maggior parte delle volte ha un significato specifico. Suggerisco solo di usare filename, forse FILENAME per enfatizzarlo. La maggior parte delle persone capirà e coloro che non lo faranno potrebbero causare danni se non capiscono che non dovrebbero colpire un segno minore o maggiore.
utente sconosciuto

2
<filename>è una convenzione in molti documenti UNIX, quindi penso che sia utile che le persone ne siano consapevoli, ma sono d'accordo che FILENAMEpotrebbe essere più facile da capire.
Mikel,

1
find -iname <filename>è migliore poiché non fa distinzione tra maiuscole e minuscole come DOS
Agnel Kurian,

8

Alcune shell lo consentono ls **/filename, il che è abbastanza conveniente.


1
Buon punto. Nelle versioni recenti di bash, l'esecuzione shopt -s globstar; echo **/filenameè equivalente a find . -name "filename". Funziona anche in zsh.
Mikel,

Questo 'ls ** / nomefile' va bene, ma sembra non andare oltre il livello di una directory.
Sopalajo de Arrierez,

@ sopalajo-de-arrierez Se lo fai shopt -s globstar, probabilmente funzionerà per te. Il globbing ricorsivo è una funzionalità disponibile solo in alcune shell e, a volte, non è attivo per impostazione predefinita.
Shawn J. Goff,

Ops ... Capisco ora, @ ShawnJ.Goff: il shoptcomando abilita l'opzione globstar on. Ora funziona perfettamente. Molte grazie.
Sopalajo de Arrierez,

4

Puoi farlo con

find . | egrep filename

1
Potresti anche farlo in uno con find . -regextype posix-egrep -regex '.*filename.*'(non so se la egrepparte è importante, ma hai usato egrepnella tua risposta quindi l'ho inclusa)
Michael Mrozek

Puoi, ma grep è diverso dal comando DOS equivalente. grepusa espressioni regolari, mentre il comando DOS usa caratteri jolly della shell.
Mikel,

1
Pensaci, anche i globs di shell sono diversi dai caratteri jolly DOS. Ad esempio, find . -name "*.*"non farà ciò che ti aspetteresti da uno sfondo DOS. I globs sono abbastanza vicini da essere riconoscibili, tuttavia, mentre le regex sono una bestia completamente nuova.
Jander,

Cosa fa *.*.*in un moderno dos cioè windows cmd? Che dire *.*.*.*?
ctrl-alt-delor

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.