検索を使用して多くの拡張機能を検索します。

検索を使用して多くの拡張機能を検索します。

ファイル拡張子のベースラインを作成し、その逆を検索したいと思います(デフォルトでは新しい拡張子を検索してそれを報告します)。

私は持っています:

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で始まるか、find2perlPythonのos.walk

関連情報