ファイル拡張子のベースラインを作成し、その逆を検索したいと思います(デフォルトでは新しい拡張子を検索してそれを報告します)。
私は持っています:
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
。