Jawaban:
Coba ini (tidak yakin apakah itu cara terbaik, tetapi berhasil):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Ini berfungsi sebagai berikut:
git ls-tree -r HEAD --name-only
alih-alihfind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Tidak perlu pipa untuk sort
, awk dapat melakukan semuanya:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
perintah tetapi perintah itu sendiri sudah menggunakan tanda kutip dalam perintah temukan. Untuk memperbaiki ini saya akan menggunakan bash
sintaks string literal sebagai berikut:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
ke akhir perintah 'temukan' dan jalankan kembali tes Anda.
Versi rekursif:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Jika Anda ingin total (berapa kali ekstensi terlihat):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
Non-rekursif (folder tunggal):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
Saya sudah mendasarkan ini pada posting forum ini , kredit harus pergi ke sana.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Powershell:
dir -recurse | select-object extension -unique
Terima kasih kepada http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
di dalamnya (mis. jquery-1.3.4
Akan muncul seperti .4
pada output). Ubah untuk dir -file -recurse | select-object extension -unique
hanya mendapatkan ekstensi file.
Alternatif awk-less, sed-less, Perl-less, Python-less POSIX-compliant saya:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Kuncinya adalah membalik garis dan memotong ekstensi di awal.
Ini juga mengubah ekstensi menjadi huruf kecil.
Contoh output:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
tidak memiliki bendera lengkap --count
, tetapi -c
berfungsi dengan baik
Temukan semuanya dengan sebuah titik dan tunjukkan hanya sufiks.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
jika Anda tahu semua sufiks memiliki 3 karakter, maka
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
atau dengan sed menunjukkan semua sufiks dengan satu hingga empat karakter. Ubah {1,4} ke rentang karakter yang Anda harapkan di akhiran.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
Menambahkan variasi saya sendiri ke dalam campuran. Saya pikir itu yang paling sederhana dari yang banyak dan bisa berguna ketika efisiensi bukan masalah besar.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
Dalam Python menggunakan generator untuk direktori yang sangat besar, termasuk ekstensi kosong, dan mendapatkan berapa kali setiap ekstensi muncul:
import json
import collections
import itertools
import os
root = '/home/andres'
files = itertools.chain.from_iterable((
files for _,_,files in os.walk(root)
))
counter = collections.Counter(
(os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)
Saya mencoba banyak jawaban di sini, bahkan jawaban "terbaik". Mereka semua kekurangan apa yang saya cari secara spesifik. Jadi selain 12 jam terakhir duduk dalam kode regex untuk beberapa program dan membaca dan menguji jawaban-jawaban ini, inilah yang saya hasilkan dengan cara yang persis seperti yang saya inginkan.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Jika Anda memerlukan hitungan ekstensi file, gunakan kode di bawah ini
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Meskipun metode ini akan membutuhkan waktu untuk diselesaikan dan mungkin bukan cara terbaik untuk menyelesaikan masalah, mereka bekerja.
Pembaruan: Per @ alpha_989 ekstensi file yang panjang akan menyebabkan masalah. Itu karena regex asli "[[: alpha:]] {3,6}". Saya telah memperbarui jawaban untuk menyertakan regex "[[: alpha:]] {2,16}". Namun siapa pun yang menggunakan kode ini harus menyadari bahwa angka-angka itu adalah min dan maks dari berapa lama ekstensi diizinkan untuk hasil akhir. Apa pun di luar rentang itu akan dipisah menjadi beberapa baris dalam output.
Catatan: Posting asli tidak membaca "- Greps untuk ekstensi file antara 3 dan 6 karakter (sesuaikan angka jika tidak sesuai dengan kebutuhan Anda). Ini membantu menghindari file cache dan file sistem (bit file sistem adalah untuk mencari penjara). "
Ide: Dapat digunakan untuk menemukan ekstensi file dengan panjang tertentu melalui:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Di mana 4 adalah panjang ekstensi file untuk disertakan dan kemudian temukan juga ekstensi di luar panjang itu.
Karena sudah ada solusi lain yang menggunakan Perl:
Jika Anda memasang Python, Anda juga bisa melakukannya (dari shell):
python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"
Tidak ada jawaban sejauh ini yang berurusan dengan nama file dengan baris baru dengan benar (kecuali untuk ChristopheD, yang baru saja masuk saat saya mengetik ini). Berikut ini bukan shell satu-liner, tetapi bekerja, dan cukup cepat.
import os, sys
def names(roots):
for root in roots:
for a, b, basenames in os.walk(root):
for basename in basenames:
yield basename
sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
if suf:
print suf
Saya pikir ini belum disebutkan:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Saya telah menemukannya sederhana dan cepat ...
# find . -type f -exec basename {} \; | awk -F"." '{print $NF}' > /tmp/outfile.txt
# cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt
Jawaban yang diterima menggunakan REGEX dan Anda tidak dapat membuat perintah alias dengan REGEX, Anda harus memasukkannya ke dalam skrip shell, saya menggunakan Amazon Linux 2 dan melakukan hal berikut:
Saya memasukkan kode jawaban yang diterima ke dalam file menggunakan:
sudo vim find.sh
tambahkan kode ini:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
simpan file dengan mengetik: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), gunakanfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
sumber