Pada mesin Linux saya ingin melintasi hierarki folder dan mendapatkan daftar semua ekstensi file yang berbeda di dalamnya.
Apa cara terbaik untuk mencapai ini dari shell?
linux
grep
filesystems
file-extension
GloryFish
sumber
sumber
.svn
), gunakanfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
sumbergit 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:sumber
alias
perintah tetapi perintah itu sendiri sudah menggunakan tanda kutip dalam perintah temukan. Untuk memperbaiki ini saya akan menggunakanbash
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:
Jika Anda ingin total (berapa kali ekstensi terlihat):
Non-rekursif (folder tunggal):
Saya sudah mendasarkan ini pada posting forum ini , kredit harus pergi ke sana.
sumber
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Powershell:
Terima kasih kepada http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
sumber
.
di dalamnya (mis.jquery-1.3.4
Akan muncul seperti.4
pada output). Ubah untukdir -file -recurse | select-object extension -unique
hanya mendapatkan ekstensi file.Alternatif awk-less, sed-less, Perl-less, Python-less POSIX-compliant saya:
Kuncinya adalah membalik garis dan memotong ekstensi di awal.
Ini juga mengubah ekstensi menjadi huruf kecil.
Contoh output:
sumber
uniq
tidak memiliki bendera lengkap--count
, tetapi-c
berfungsi dengan baikTemukan semuanya dengan sebuah titik dan tunjukkan hanya sufiks.
jika Anda tahu semua sufiks memiliki 3 karakter, maka
atau dengan sed menunjukkan semua sufiks dengan satu hingga empat karakter. Ubah {1,4} ke rentang karakter yang Anda harapkan di akhiran.
sumber
-name "."
hal itu karena memang sudah seperti ituMenambahkan variasi saya sendiri ke dalam campuran. Saya pikir itu yang paling sederhana dari yang banyak dan bisa berguna ketika efisiensi bukan masalah besar.
sumber
$ 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:
sumber
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.
Jika Anda memerlukan hitungan ekstensi file, gunakan kode di bawah ini
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:
Di mana 4 adalah panjang ekstensi file untuk disertakan dan kemudian temukan juga ekstensi di luar panjang itu.
sumber
Karena sudah ada solusi lain yang menggunakan Perl:
Jika Anda memasang Python, Anda juga bisa melakukannya (dari shell):
sumber
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.
sumber
Saya pikir ini belum disebutkan:
sumber
Saya pikir cara yang paling sederhana & mudah adalah
Itu dimodifikasi pada cara 3 ChristopheD.
sumber
Anda juga bisa melakukan ini
sumber
Saya telah menemukannya sederhana dan cepat ...
sumber
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:
simpan file dengan mengetik:
:wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
sumber