Trova i file in base alla lunghezza del nome file


10

Voglio trovare tutti i file in base alla lunghezza dei nomi dei file.

Per esempio se voglio trovare i file di lunghezza 1, ad esempio a.go, b.go.

Metto:

grep '.\{1\}' file

Ma questo non funziona. Quale comando posso usare per trovare i file in base alla lunghezza del nome file?


a.goè un nome file di lunghezza 4. aè un nome file di lunghezza 1. Questo è Unix, non DOS in cui il nome e l'estensione erano separati e un implicito .faceva sempre parte del nome file.
Peter Cordes,

Risposte:


3

grepcerca schemi nei contenuti dei file. Se vuoi guardare i nomi dei file, puoi semplicemente usare un shell glob (se vuoi considerare solo i nomi di file nella directory corrente):

echo ?.go

(A proposito, è la shell che valuta il glob, non il echocomando.)

Se si desidera consultare ricorsivamente le directory, a partire dalla directory corrente, lo strumento da utilizzare è find:

find . -name '?.go'

(Si noti che è necessario citare il modello per impedire alla shell di valutarlo come glob prima di essere findinvocato.)


1
Questo troverà anche directory che corrispondono allo schema '? .Go'.
slm

@slm, le directory sono uno dei tanti tipi di file, l'OP non ha specificato il tipo di file che stava cercando.
Stéphane Chazelas,

8

Se vuoi solo trovare i nomi dei file, puoi usare il seguente comando:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Verrà eseguito find, estraendo il nome del file o della directory utilizzando basenamee quindi cercare qualsiasi nome di file o directory che contenga almeno 100 caratteri. Se si desidera trovare un nome file di una lunghezza esatta, utilizzare {100}invece di {100,}.

Se vuoi trovare i nomi dei file incluso il percorso, procedi come segue:

find | egrep '/[^/]{100,}$'

Ciò restituirà il nome file incluso il percorso relativo in cui è stato eseguito il comando find.


3

Prima di tutto, grepcerca tra i contenuti dei file, non cercherà i nomi dei file. Per quello che vuoi find. Non ha un'opzione per impostare la lunghezza del nome file, ma puoi analizzarne l'output per ottenere ciò che desideri. Ecco alcuni esempi che eseguo in una directory contenente i seguenti file:

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

La ricerca di file in questa directory restituisce:

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

Quindi, per trovare i file con una lunghezza di X, dovremo rimuovere il percorso e abbinare solo i caratteri dopo l'ultimo /:

 $ find . -type f | grep -P '/.{3}$'

Il sedcomando rimuove semplicemente il ./. Il -Pflag attiva le espressioni regolari compatibili Perl che sono necessarie per le {n}quali è una cosa PCRE e il $mezzo "corrisponde all'estremità della stringa".

Potresti anche semplicemente fare questo:

find . -type f | grep -P '/...$'

Va bene per i piccoli numeri che digitano 15 punti per abbinare nomi di file di lunghezza 15 non è molto efficace.

Infine, se vuoi ignorare l'estensione e far corrispondere solo il nome del file, fai questo (come suggerito da @slm):

find . -type f | grep -P '/.{1}\.'

Tuttavia, questo troverà anche file come a.bo.go. Questo è meglio se i nomi dei file possono contenere più di uno .:

find . -type f | grep -P '/.{1}\.[^.]+$'

NOTA: la soluzione sopra presuppone che tu abbia nomi di file relativamente sani che non contengono nuovi caratteri di linea, ecc. Conterà inoltre di non ignorare gli spazi nei nomi di file quando calcoli la lunghezza che potrebbe non essere quella che desideri. Se uno di questi è un problema, fammi sapere e aggiornerò la mia risposta.


1

Non si specifica ma se i file si trovano all'interno di una struttura di directory è possibile utilizzare findper individuare i file di lunghezza 1, con l'aiuto di grep:

$ find . -type f  | grep -P '/.{1}\.'

Esempio

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

Su MacOS X, usa egrep e rimuovi l'opzione -P
Bart Kummel,

@BartKummel - attualmente su OSX che uso ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Comprendi anche che questo Q non è stato etichettato come OSX, quindi l'uso di grepè apt.
slm

1

Vorrei usare qualcosa del genere.

find . -type f -name "?.go"

Quindi se ne metti due "?" quindi stai cercando nomi di file con due caratteri e l'estensione.


0

Quando si desidera utilizzare l'espressione regolare nel comando find, è necessario utilizzare ""come:

find /var/log -iname "*.err" 

per il tuo caso d'uso:

find yourpath -type f -a -name "?.go"

È necessario sostituire il vostro vero percorso con yourpath, -amezzi And -type fsignifica che siete solo alla ricerca di file normali.

? nella tua query significa un carattere come DOS se ricordi.


-1

ls ?.* dovrebbe darti i risultati desiderati.


benvenuti in Unix.SE. Purtroppo non è utile aggiungere risposte a vecchie domande che hanno già molte buone risposte. (A meno che non esista un nuovo modo migliore per risolvere un vecchio problema o che tu non abbia una soluzione migliore di una qualsiasi delle vecchie risposte.) Se vuoi rispondere ad alcune domande, guarda le nuove domande in prima pagina.
Peter Cordes,
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.