찾기를 사용하여 많은 확장 프로그램을 검색하세요.

찾기를 사용하여 많은 확장 프로그램을 검색하세요.

파일 확장자의 기준선을 생성한 다음 그 반대를 검색하고 싶습니다(기본적으로 새 확장자를 검색한 다음 이를 보고합니다).

나는 가지고있다:

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.

관련 정보