Elenca tutte le estensioni univoche per i file contenuti in una directory


11

Vorrei vedere tutta l'estensione unica dei file contenuti in una determinata directory. Qual è il comando per farlo in bash?

Si potrebbe usare find . -type fper ottenere tutti i file nella directory corrente, quindi rimuovere l'estensione e reindirizzarla uniq. Qual è il modo più semplice per rimuovere l'estensione?

Risposte:


15

Prova questo:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

Non produce nulla per:

  • File senza estensione
  • File con nomi che finiscono in un punto
  • File nascosti

Potrebbe anche essere utile collegarlo a sort | uniq -c.


Non funziona con il sed predefinito sul mio Mac. Ricevosed: illegal option -- r
dzhelil il

8
@celil: utilizzare -Eanziché -rsu OS X.
Sospeso fino a nuovo avviso.

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Funziona su OS X, ad eccezione dei file senza estensione. La mia cartella dei download:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

Potresti aver bisogno sed -rinvece?


Problema minore: i file senza estensioni stampano il loro nome. I file nascosti (come .DS_Store) stampano il loro nome senza aprire ..


Consiglierei sort -uinvece di sort | uniq. Meno biforcazione e utilizzo delle risorse.
John T,

Grazie @Giovanni. Ho cercato di rimanere all'interno della "struttura" di Celil, quindi non ci ho pensato.
Daniel Beck

Non è necessario sfuggire a un punto all'interno [].
In pausa fino a ulteriore avviso.

3

Ecco un'altra soluzione che non viene confusa dai nomi dei file contenenti newline incorporate e utilizza sort -uzper ordinare correttamente le estensioni dei file che possono avere anche newline incorporate:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

Un modo rapido e facile da ricordare per eliminare l'estensione è quello di assumere che tutti i nomi dei file abbiano il formato "nome.ext", quindi utilizzare:

 ls -1 | cut -d"." -f2- | sort | uniq -c

questo fornisce un conteggio di quante estensioni uniche ci sono, ad esempio:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

1

vedi, ecco perché mi piace awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
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.