Trên máy Linux, tôi muốn duyệt qua hệ thống phân cấp thư mục và nhận danh sách tất cả các phần mở rộng tệp riêng biệt trong đó.
Điều gì sẽ là cách tốt nhất để đạt được điều này từ một cái vỏ?
Trên máy Linux, tôi muốn duyệt qua hệ thống phân cấp thư mục và nhận danh sách tất cả các phần mở rộng tệp riêng biệt trong đó.
Điều gì sẽ là cách tốt nhất để đạt được điều này từ một cái vỏ?
Câu trả lời:
Hãy thử điều này (không chắc đó là cách tốt nhất, nhưng nó hoạt động):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Nó hoạt động như sau:
git ls-tree -r HEAD --name-only
thay vìfind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Không cần đường ống đến sort
, awk có thể làm tất cả:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
lệnh nhưng bản thân lệnh đã sử dụng dấu ngoặc kép trong lệnh find. Để khắc phục điều này, tôi sẽ sử dụng bash
cú pháp chuỗi bằng chữ như sau:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
vào cuối lệnh 'find' và chạy lại bài kiểm tra của bạn.
Phiên bản đệ quy:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Nếu bạn muốn tổng số (số lần mở rộng được nhìn thấy):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
Không đệ quy (thư mục đơn):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
Tôi đã dựa trên bài đăng trên diễn đàn này , tín dụng sẽ đến đó.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Quyền hạn:
dir -recurse | select-object extension -unique
Cảm ơn http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
trong đó (ví dụ: jquery-1.3.4
sẽ hiển thị như .4
trong đầu ra). Thay đổi để dir -file -recurse | select-object extension -unique
chỉ nhận phần mở rộng tập tin.
Giải pháp thay thế phù hợp với POSIX của tôi, ít hơn, ít sử dụng, không có Perl, không có Python:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Thủ thuật là nó đảo ngược dòng và cắt phần mở rộng ở đầu.
Nó cũng chuyển đổi các phần mở rộng thành chữ thường.
Ví dụ đầu ra:
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
không có đầy đủ cờ --count
, nhưng -c
chỉ hoạt động tốt
Tìm everythin với một dấu chấm và chỉ hiển thị hậu tố.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
nếu bạn biết tất cả hậu tố có 3 ký tự thì
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
hoặc với sed hiển thị tất cả các hậu tố có từ một đến bốn ký tự. Thay đổi {1,4} thành phạm vi các ký tự bạn mong đợi trong hậu tố.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
Thêm biến thể của riêng tôi vào hỗn hợp. Tôi nghĩ đó là cách đơn giản nhất trong số rất nhiều và có thể hữu ích khi hiệu quả không phải là mối quan tâm lớn.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
Trong Python sử dụng trình tạo cho các thư mục rất lớn, bao gồm các tiện ích mở rộng trống và nhận được số lần mỗi tiện ích mở rộng hiển thị:
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)
Tôi đã thử một loạt các câu trả lời ở đây, ngay cả câu trả lời "tốt nhất". Tất cả họ đã nghĩ ra những gì tôi đặc biệt là sau đó. Vì vậy, ngoài 12 giờ ngồi mã regex cho nhiều chương trình và đọc và kiểm tra những câu trả lời này, đây là những gì tôi nghĩ ra, nó hoạt động CHÍNH XÁC như tôi muốn.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Nếu bạn cần số lượng phần mở rộng tập tin thì hãy sử dụng đoạn mã dưới đây
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Mặc dù các phương pháp này sẽ mất một chút thời gian để hoàn thành và có lẽ không phải là cách tốt nhất để giải quyết vấn đề, chúng vẫn hoạt động.
Cập nhật: Phần mở rộng tệp dài Per @ alpha_989 sẽ gây ra sự cố. Đó là do regex ban đầu "[[: alpha:]] {3,6}". Tôi đã cập nhật câu trả lời để bao gồm regex "[[: alpha:]] {2,16}". Tuy nhiên, bất cứ ai sử dụng mã này nên lưu ý rằng những con số đó là tối thiểu và tối đa của thời gian mở rộng được phép cho đầu ra cuối cùng. Bất cứ điều gì ngoài phạm vi đó sẽ được chia thành nhiều dòng trong đầu ra.
Lưu ý: Bài đăng gốc đã đọc "- Greps cho phần mở rộng tệp từ 3 đến 6 ký tự (chỉ cần điều chỉnh số nếu chúng không phù hợp với nhu cầu của bạn). Điều này giúp tránh các tệp bộ đệm và tệp hệ thống (bit tệp hệ thống là để tìm kiếm tù). "
Ý tưởng: Có thể được sử dụng để tìm các phần mở rộng tệp trong một độ dài cụ thể thông qua:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Trong đó 4 là độ dài phần mở rộng tệp để bao gồm và sau đó tìm bất kỳ tiện ích mở rộng nào ngoài độ dài đó.
Cho đến nay, không có câu trả lời nào liên quan đến tên tập tin với các dòng mới (ngoại trừ của BarsheD, vừa xuất hiện khi tôi đang gõ cái này). Dưới đây không phải là lớp vỏ một lớp, nhưng hoạt động, và khá nhanh.
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
Tôi không nghĩ rằng cái này đã được đề cập đến:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Tôi đã tìm thấy nó đơn giản và nhanh chóng ...
# 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
Câu trả lời được chấp nhận sử dụng REGEX và bạn không thể tạo lệnh bí danh với REGEX, bạn phải đặt nó vào tập lệnh shell, tôi đang sử dụng Amazon Linux 2 và đã làm như sau:
Tôi đặt mã câu trả lời được chấp nhận vào một tệp bằng cách sử dụng:
sudo vim find.sh
thêm mã này:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
lưu tệp bằng cách gõ: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), hãy sử dụngfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
nguồn