2/10/2015

find 확장 조합 (grep , xarg)

1. Linux 에서 검색방법

개별 find or grep으로 검색으을 하면, 어느정도의 한계를 느낄 것이며, 이를 확장해주는 것이 xargs의 기능이라고 생각한다.
이를 pipe라는 기능을 사용하여, '|'  조합으로 기본 구성을 하여 사용해보고, 단순 검색인
find와 grep을 이용을 해보자.


1.1 find 이용한 기본 검색 

  • find name 검색 

$ find . -name board // kernel 에서 board  filename 검색 
./Documentation/devicetree/bindings/board
./drivers/staging/board

$ find . -name '*.c' // *.c file 파일 검색 
.....

  • find로 변경시간 검색 
-5 or -10 , 즉 5분 전 or 5일 전 것이 가장 유용하게 이용이 될것이며, 파일이 많으면,
head or tail 이용하자

-cmim :  File의 status가 변경된 시간 (기준 n minute)
-ctime :  File의 status가 변경된 시간 (기준 n*24 hours, 1 day)
-mmin:   File의 data가 변경된 시간 (기준 n minute)
-mtime:  File의 data가 변경된 시간 (기준 n*24 hours , 1 day )


$ find . -cmin -5 //  -5 분이하, 즉 5분전  파일 변경된 것 검색 
./.config

$ find . -cmin 5         //  정확히 5 분 전 것만 검색 , 별로 검색에 필요 없음 
$ find . -cmin +5 | head //  +5 분이상, 즉 5분 후  파일 변경된 것 검색 , 파일이 너무 많아 head 사용 
./.tmp_kallsyms2.o
./mm
./mm/.filemap.o.cmd
./mm/.mincore.o.cmd
./mm/mremap.o
./mm/.compaction.o.cmd
./mm/page_isolation.o
./mm/.msync.o.cmd
./mm/modules.builtin
./mm/zsmalloc.c  

$ find . -ctime -5   //  파일 변경된 것 -5 *24 시간 이하     , 즉 5일 이전것 
.
./init
./include/linux
./kernel/sched
./arch/arm/boot/compressed
./arch/arm/kernel
./.config.old

$ find . -ctime 5    //  파일 변경된 것 5*24 hours 시간된 것 ,
$ find . -ctime +5   //  파일 변경된 것 +5 *24 hours 시간이상, 즉 5일 이후것  


atime /amin : 즉 access time 도 존재하지만 , debugging 할 경우에나 필요할 것 같다.

  • find로 size 기준으로 검색 
find로 file size 기준으로 검색

$ find -size -512c  // 512 byte 이하 검색 
$ find -size -4k  // 4k byte 이하 검색 
$ find -size -4M  // 4M byte 이하 검색 
$ find -size -4G  // 4G byte 이하 검색 

  • grep을 이용한 검색 
grep을 이용하며, 검색하면 좋지만, 시간 상당히 걸리뿐만 아니라
가끔 시스템이 죽을 경우도 존재한다.


$ grep -n _board_ ./System.map // System.map 파일 안에서 _board_ 검색하고 line을 출력 
$ grep -n _board_ ./System.map 
678:c001ff70 t omap_mux_dbg_board_open
680:c001ffc0 t omap_mux_dbg_board_show
18680:c043faf0 T spi_register_board_info
28085:c0679ecc r omap_mux_dbg_board_fops
37105:c088aeb8 R __ksymtab___i2c_board_list
37106:c088aec0 R __ksymtab___i2c_board_lock
45157:c08964c8 r __kcrctab___i2c_board_list
45158:c08964cc r __kcrctab___i2c_board_lock

$ grep -r _board_ .              // 현재 directory부터 모든 파일 안의 _board_  검색을 한다 
./System.map:c001ff70 t omap_mux_dbg_board_open
./System.map:c001ffc0 t omap_mux_dbg_board_show
./System.map:c043faf0 T spi_register_board_info
./System.map:c0679ecc r omap_mux_dbg_board_fops
./System.map:c088aeb8 R __ksymtab___i2c_board_list
./System.map:c088aec0 R __ksymtab___i2c_board_lock
./System.map:c08964c8 r __kcrctab___i2c_board_list
./System.map:c08964cc r __kcrctab___i2c_board_lock
./System.map:c08b2e64 r __kstrtab___i2c_board_list
./System.map:c08b2e75 r __kstrtab___i2c_board_lock
./System.map:c08cc7d4 T omap_serial_board_init
./System.map:c08e73c4 T i2c_register_board_info
./System.map:c08fc398 t pmic_i2c_board_info
./System.map:c0911390 d musb_default_board_data
./System.map:c0945560 D __i2c_board_lock
./System.map:c094556c D __i2c_board_list
.....

1.2. 기본조합 (find와 grep)

find만 이용할 경우 file list 만을 검색을 하지만, 여기서 grep을 이용하여 file list를 
find에서 검색한 list 에서만, grep을 이용하여 find의 검색 정보의 정확성을 높힌다.
사실 그리 좋은 조합은 아닌 것 같다.

1. find 로 *.c 파일 file list을 생성
2. *.c file list 입력을 받아 이를 grep 으로 board관련된 내용 file list 줄임


$ find . -name '*.c' | grep board  // find 로 전체 *.c 파일 list 생성
./sound/soc/intel/boards/haswell.c
./sound/soc/intel/boards/skl_rt286.c
./sound/soc/intel/boards/bytcr_rt5640.c
./sound/soc/intel/boards/byt-max98090.c
./sound/soc/intel/boards/broadwell.c
./sound/soc/intel/boards/cht_bsw_rt5645.c
./sound/soc/intel/boards/cht_bsw_max98090_ti.c
./sound/soc/intel/boards/mfld_machine.c
./sound/soc/intel/boards/cht_bsw_rt5672.c
./sound/soc/intel/boards/byt-rt5640.c
./kernel/debug/kdb/kdb_keyboard.c
./arch/arm/mach-tegra/board-paz00.c
./arch/arm/mach-omap2/board-generic.c
./arch/arm/mach-omap2/board-ldp.c
./arch/arm/mach-omap2/board-rx51-peripherals.c
./arch/arm/mach-omap2/common-board-devices.c
./arch/arm/mach-omap2/board-n8x0.c
./arch/arm/mach-omap2/board-rx51.c
./arch/arm/mach-omap2/board-rx51-video.c
./arch/arm/mach-omap2/board-flash.c
./arch/arm/mach-ux500/board-mop500-audio.c
./arch/arm/mach-ux500/board-mop500-regulators.c
./arch/arm/mach-omap1/board-h2-mmc.c
./arch/arm/mach-omap1/board-perseus2.c
./arch/arm/mach-omap1/board-osk.c


1.3 find 와 xargs 와 greps 조합 검색

  • xargs 와 pipe의 조합기능 
 xargs - build and execute command lines from standard input
 xargs는 stdin으로 부터 들어온 command lines을 실행하거나 빌드하는 기능이다.

쉽게 말하면

  1. find  *.c   |  xargs grep xx  // c파일을 찾아 list 만들고 이를 grep에게 argument로 전달 
  2. find  *.h  |  xargs rm    xx  // h파일을 찾아 list 만들고 이를 rm에게  argument로 전달 


xargs를 이용하여, grep으로 검색을 하되 find에서 검색한 내용안 에서만 검색을 한다.
위의 검색과  차이가 있다.


$ find . -name '*.c' | xargs grep dram_init   // *.c 검색해서  grep으로 *.c파일만 dram_init 내용을 검색 


1.4. xargs 확장 사용 

xargs: 파이프 이전의 명령의 결과 값들을 인자로 보내어 주어 실행시킴.
이름도 xargs , 현재 여러 인자를 TEST 못해봄.  주로, 인자 하나만 사용해봄.

$ find . -name '*.o' | xargs  grep 찾고자 하는 file 
$ find . -name '*.mk' -o -name 'Makefile' | xargs grep odroid 
$ find . -name '*.mk' | xargs rm 


Ref.
  http://stackoverflow.com/questions/7339253/find-and-number-of-days-range
  http://qdata.co.kr/bo/bbs/board.php?bo_table=ltip&wr_id=210


2. 소스내 패턴검색 (sed,xarg 응용)

sed를 알고나서, xarg에 적용을 하고 난뒤 아래와 같은 조합으로 만들어봤는데,
소스검색방법으로 정말 최적인것 같다.
SSD가 아닌곳에서도 소스검색용으로는 최적인것 같다.


sed 및 xargs와 grep를 이용하여, 빌드만 된 소스에서 원하는 패턴을 검색

      1. find로  obejct 검색한다.
      2. sed 로 *.o 에서 *.c로 변경한다. (검색결과 파이프로 받는다)
      3. xargs를 이용하여 grep 명령을 실행한다. (-r 재귀명령어, -s  no-messages )


$ find . -name '*.o' | sed -e 's/o$/c/g' | xargs grep -rs 'stmmac'


3. Find 기타사용

  • 소스 파일 추출  (cscope 파일 사용)

Find 사용하여, 소스 File 추출

$ find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' -o -name '*.asm' \) -print > cscope.files 

ex) 특정 파일 추출

    하나 추가할때마다 -o -name 사용

$ find . -name '*.c' -o -name '*.h' 


ls 하여 파일을 다시 grep으로 avc포함된 파일만  ./avc 폴더로 이동

$ ls | grep avc | xargs -i mv {} ./avc  

  https://kldp.org/node/35902