使用 find 搜索大量扩展名

使用 find 搜索大量扩展名

我希望创建文件扩展名的基线,然后搜索它们的倒数(本质上是扫描新扩展名,然后报告它们)。

我有:

base_file=`find "/volume1/" -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -u`

创建我的基线 - 卷上文件的初始搜索。

对于少量文件,使用

find $dir -type f \( -not -name "foo*" -and -not -name "*bar" \) 

工作得很好。唉,不过我有大量文件。如果我将每个唯一的扩展名通过管道传输到find命令中,它就不起作用(可以理解)。

前任。输出:

.acx .adb .aex .agt .ahs .alt .amsorm .ANI .ARTX .ASAX .ASDefs .asmdot .ASMDOT .ASPX .atb .atm .aus .auth .authd .awk .ben .Bin .BIO .bkp .bms .boo .bootstrap .bplist .bridgesupport .bto .btt .CBK .ccp .cd .cdm .cdrom .CFGOLD .cfm .cfp .CFS .cg .cidb .cilk .clk .cmptag .CMValidateMovieDataReferenceService .ColorSyncXPCAgent .common .con .CONFIG .COR .cpi .cpu .crc .crdownload .crmlog .cryptodev .csh .ctd .ctl .cue .cws .d .daeexportpreset .daeimportpreset .DATA .dbg .DBG .dbl .DCD .DCX .debug .defaults .defltools .defmtools .der .desktop .dfont .DGDLL .DGN .DictionaryServiceHelper .dig .django .dla .dlb .dlh .dlk .dLL .dlmp .DLO .DMP .DNP .dps .DriverHelper .DRWDOT .dsd .dtc .DTL .dwd .dwfx .dwG .e .eai .eapol .EDB .edc .edited .ENC .eng .ENV .epub .erl .esi .esm .EVM .EVP .ews .example .exv .fac .fatal .fbk .FBK .fbT .FCL .fe .file .fin .fl .FLL .font .FontDownloadHelper .for .fpk .fre .frT .FW .FXP .gadget .Gadget .gdb .generic .ger .gi .glo .gm .gpx .groovy .group .gsl .gss .gws .GZ .ham .hbs .hd .hidden .hkf .hpdata .hs .htb .HTT .hun .hx .hxd .hxx .HXX .IBM .ICNS .igb .IGS .iHB .imaging .IME .IMG .in .INP .install .Installsettings .int .IPConfiguration .IPMonitor .ITK .ITS .iuf .java .jnilib .job .JPEG .jqx .kd .keychainproxy .keys .kondo .krn .kscript .ksh .lfs .libraries .LID .lisp .liveReg .local .LOCAL .lok .lppi .lsl .lt .ltools .mak .mako .mapping .mappings .mas .masm .matlab .mbr .mch .MDE .mdmp .mdw .me .med .MediaLibraryService .mem .mholders .MIF .MIG .min .mk .mm .mno .mobileconfig .mom .mp .MPE .mpq .MPV .mpx .MPX .msdb .MSDefs .msilog .MSM .MSP .mtools .mup .nasm .netsa .new .nfm .nlog .nor .nsi .ntd .numbers .nut .nv .nvv .NWD .O .oai .oct .Ocx .oft .ogv .older .omo .ooc .openAndSavePanelService .ori .orignal .osf .override .pad .page .partial .pas .patch .pbb .pch .Pdf .PDFFileRefsValidator .pdn .PDR .pexe .pfw .phar .pif .pike .pix .PJT .PJX .PLS .plsql .po .pokki .pot .ppf .ppk .pptm .preferences .PRG .prm .PRN .pro .propdesc .prtdot .PRTDOT .prx .PSDefs .PST .psw .pta .ptb .ptg .python .r .rayhosts .rc .rcd .RCF .rd .RecentPictureService .regcccc .registerassistantservice .RLA .rnd .rpk .RPW .RSC .rst .rupldb .rus .salog .sap .SAP .sbt .sbx .sbxx .SCH .schemas .scm .SCR .sct .SDP .sds .sdu .Search .securityd .SEP .set .setup .Setuplog .SFV .sfx .sgi .sgn .sidb .sidd .sigs .sites .skin .slddrt .smc .SMC .smf .smilebox .SOL .spdc .speechsynthesisd .spn .sqfs .squashfs .srt .srx .ssi .st .ste .stg .styx .swb .swtag .TAR .TDC .tdf .tex .th .tib .time .tips .tmx .tpg .tpm .trace .transformed .trm .TSK .tst .Txt .txz .type .udf .ufm .ult .uninstall .upd .upstart .urf .user .User .UserDictionary .UserProfile .UserScriptService .usr .ux .v .vala .values .var .VAR .vbe .VBR .vcs .vcxproj .vdb .vdf .VERSION .VersionsUIHelper .vhdl .vms .vmsn .vmss .VOL .voucher .vps .vsb .vst .vvv .wax .wbt .Wdf .webp .WIZ .wnt .WPT .ws .wsc .wsdl .WSF .wsp .xap .xht .XLL .xlS .XLT .xmp .xpfwext .xtext .yaml .zipx .zz

我怎样才能搜索所有这些或相反的内容而不遇到问题?或者,更重要的是,对于此类任务是否有更好的解决方案?

答案1

您可以使用grep-f选项来搜索存储在文件中的模式列表:

# find "$dir" -type f | grep -f ext_patterns.txt

这里的文件ext_patterns.txt必须包含正则表达式的扩展名,例如:

\.html$
\.java$
\.jpg$

您可以像创建基线一样创建该文件。这是一个使用的命令awk

find -type f -name "*.*" \
| awk -F. '{ print "\\." $NF "$" }' \
| sort -u \
> ext_patterns.txt

这里find输出具有扩展名的文件名;awk打印扩展名以及前导(转义)点和结尾$(正则表达式代码,意思是“行尾”);并使sort -u每个图案都独一无二。

答案2

假设您有 GNU find 或 FreeBSD/macOS find,您可以构造一个匹配所有模式的大型正则表达式,并使用-regex.请注意,构造正则表达式并不简单:您需要注意扩展名中的特殊字符。如果文件名的扩展名包含换行符,您当前的代码已经没有做任何明智的事情。使用 GNU 工具,您可以做到(未经测试)

new_extensions=$(find / -regextype posix-extended -name '*.*' -type f ! -regex "$old_regex" -print0 |
                 sed -z 's/.*\.//; s/[][\\$^.()|*+?]/\\&/g' |
                 sort -zu | tr '\0' '|')
if [ "$new_extensions" = "|" ]; then
  echo "No new extensions"
else
  new_regex="\\.(${new_extensions%?})\$"
fi

我认为使用 perl/python/ruby 脚本会更好。您可以从 Python 开始find2perl或使用 Python 的os.walk.

相关内容