레이블이 Tips For Linux인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tips For Linux인 게시물을 표시합니다. 모든 게시물 표시

10/12/2018

dd 와 hd/hexdump 사용법

1. dd 명령어

일반적으로 리눅스에서 block device의 data를 backup or data를 block device에 저장할때 주로 많이 사용이 되어지며, 본인이 원하는 image file을 생성시 사용된다.

사용법은 입력과 출력을 정하고 본인이 원하는 옵션을 넣어 복사를 진행한다. 그리고 복사되는 시간을 알려준다.


1.1 dd의 기본사용법 

dd의 기본사용법 아래와 같은 방법으로 사용

$ dd if=(input file)  of=(output file) bs=(block size) skip=(input offset) seek=(output offset) conv=(conversion) 
$ dd if=test1 | cat          // 파이프 사용 stdout   
$ cat test1   | dd of=test2 //  파이프 사용 stdin  

bs는 2의 지수이며, 일반적으로 512단위로 사용 (ie, 512, 1024, 2048, 4096, 8192, 16384)



1.2  dd의 세부옵션  


주요 옵션은 다음과 같으며, 자세한 정보를 알고 싶으면, $man dd 로 알아보자.

OPERAND DESCRIPTION
bs=BYTES read and write up to BYTES bytes at a time (한번에 사용가능 Block Size 설정 in/out)
conv=CONVS convert the file as per the comma separated symbol list (옵션은 아래 참조)
count=N copy only N input blocks (default: 512 , 상위 bs 변경가능)
ibs=BYTES read up to BYTES bytes at a time (default: 512) 상위 bs의 input 세부설정
if=FILE read from FILE instead of stdin (Input File)
iflag=FLAGS read as per the comma separated symbol list
obs=BYTES write BYTES bytes at a time (default: 512) 상위 bs의 output 세부설정
of=FILE write to FILE instead of stdout (Onput File)
oflag=FLAGS write as per the comma separated symbol list
seek=N skip N obs-sized blocks at start of output (output 의 offset 기능 ,단위는 상위 bs,obs)
skip=N skip N ibs-sized blocks at start of input (input 의 offset 기능 ,단위는 상위 bs,ibs)


  1. N은 Block의 갯수 
  2. bs/ibs/obs는 Block의 크기 결정 (default:512)

  • N/BYTES 에 사용되는 suffix
N/BYTE의 suffix 단위Bytes
c1
w2
b512
K1024
kB1000
M1024*1024
MB1000*1000
G1024*1024*1024
xM1000*1000*1000

  • conv 옵션
CONVS DESCRIPTION
nocreat do not create the output file
notrunc do not truncate the output file (output file를 크기 줄이지 않고 유지)
noerror continue after read errors
fdatasync physically write output file data before finishing

  • iflag/oflag 옵션 
FLAG DESCRIPTION
dsync use synchronized I/O for data
sync dsync기능과 metadata도 포함 (MBR)
noerror continue after read errors
count_bytes treat 'count=N' as a byte count (iflag only)
skip_bytes treat 'skip=N' as a byte count (iflag only)
seek_bytes treat 'seek=N' as a byte count (oflag only)


1.3 MBR의 구성

Master Boot Record 약자이며 MBR 은 1 Sector (512 Byte)에 존재하며, 구조는 wiki를 보면 설명이 자세히 나온다.
이는 fdisk 와 parted 방식으로 사용할 경우 각각의 MBR이 조금씩 다른것으로 파악됨 

  • Classical generic MBR구성 (fdisk 사용할 경우)
  1. 446 bytes bootstrap 
  2. 064 bytes Partition table(16bytes x 4)
  3. 002 bytes Signature (0x55 0xAA)

MBR 구성
  https://en.wikipedia.org/wiki/Master_boot_record
  https://ko.wikipedia.org/wiki/%EB%A7%88%EC%8A%A4%ED%84%B0_%EB%B6%80%ED%8A%B8_%EB%A0%88%EC%BD%94%EB%93%9C

GPT (parted 기반구성)
  https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface


1.4. dd의 기본사용법 


  • 자주사용하는 장치 FILE
  1. /dev/zero  : 0값 
  2. /dev/random : random 값
  3. /dev/urandom : random 값
  4. /dev/null   : remove
  5. /dev/sdx(a,b,c,d)   : SATA Device   (1st,2nd,3st,4st)
  6. /dev/sda(1,2,3,4)   : SATA Partition (1st,2nd,3st,4st)
  7. /dev/mmcblkx(0,1,2) : SD Card Device   (1st,2nd,3st,4st)  
  8. /dev/mmcblkxp(0,1,2) : SD Card Partition (1st,2nd,3st,4st) 
  9. /dev/mem  : memory map I/O ( offset: virtual address)
  10. /dev/loop(0,12,3): loop device  


  https://ko.wikipedia.org/wiki//dev/random
  https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.files/mem.htm
  
  • losetup 기본 사용법
간단하게 loop device를 이용하여 image를 만들고자 할때 많이 사용하여, 이와 함께 dd /fdisk/ mount를 이용하여 세부구성한다.
//losetup은 attach 를 한 후 반드시 사용 후 detach
$ sudo losetup /dev/loop0 ./data.img          //attach device ( data.img는 /dev/loop0를 통해 접근가능)
$ sudo losetup -a                             //현재 연결된 loop device 확인  
....    // fdisk or dd or mount를 이용하여 /dev/loop0으로 접근하여 data.img를 구성 
$ sudo losetup -d /dev/loop0                  //detach device ( data.img 와 /dev/loop0 연결끊음)

//losetup은 attach 를 하지만 offset를 정해서 사용
$ sudo losetup -o0 /dev/loop0 ./data.img     //attach device (offset 0 byte에 연결) 
....
$ sudo losetup -d /dev/loop0                 //detach device


$ sudo losetup -e des /dev/loop0 ./data.img   //attach device 와 encrytion 함
....
$ sudo losetup -d /dev/loop0




  • 일반적인 장치 복사 및 Backup 
$ dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync    //SDA 장치 전부 
$ dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=4096 conv=noerror,sync         //mmcblk0 장치전부

//한번에 4096 byte씩 input 에서 읽어서 output 전송 , 물론 output은 input보다 작으면 안된다.

$ dd if=/dev/sda1 of=sda1.img      // sda 1st partition , Backup  

$ dd if=sda.img of=/dev/sda      // sda에 sda.img write


  • 압축이미지 생성 및 복구 
$ dd if=/dev/sda | gzip -c > sda.img.gz 
$ md5sum sda.img.gz  > sda.img.gz.md5sum
//Backup 압축 이미지 생성 

$ gzip -dc sda.img.gz | dd of=/dev/sda
//Backup Image로 복구 


  • MBR Delete, Backup ,  Restore
$ dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc  
// file의 길이를 줄이지 않고, 앞에 512byte만 삭제 

$ dd if=/dev/sda of=sda.img bs=512 count=1
//Backup MBR   

$ dd if=sda.img of=/dev/sda bs=512 count=1
//Restore MBR

$ dd if=/dev/sda of=/tmp/sdambr2.img bs=446 count=1
//Backup only boot data of MBR , Remove partition table  


1.5 dd 와 losetup 같이 File Image 생성 

  • data.img 생성 과 data.img 구성방법

//1. 빈 500MB data.img Image 생성
$ dd if=/dev/zero of=data.img bs=1k count=500k 
....
524288000 바이트 (524 MB) 복사됨, 1.91343 초, 274 MB/초
// 0으로 채우며, 한번에 1024byte 씩 500*1024 반복하여 Image 생성 (500*1024*1024)

//2. 새로 생성된 data.img  파티션 설정 
$ fdisk ./data.img   // fdisk를 사용하여 Partition 설정

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1023999, default 2048): 204800
Last sector, +sectors or +size{K,M,G} (204800-1023999, default 1023999): //Enter 

Command (m for help): w
The partition table has been altered!
//상위 204800x512 ~ 1023999x512 Partition 생성완료

$ fdisk -l ./data.img  // fdisk를 사용하여 Partition 생성확인
Disk ./data.img: 500 MiB, 524288000 bytes, 1024000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5591d382

Device      Boot  Start     End Sectors  Size Id Type
./data.img1      204800 1023999  819200  400M 83 Linux

//3. EXT4 FS 포맷 (204800x512 ~ 1023999x512) 상위주소 확인
$ sudo losetup -o $((512 * 204800)) /dev/loop0 data.img
$ sudo mkfs -t ext4 /dev/loop0
$ sudo losetup -d /dev/loop0

//4. data.img 내부의 EXT4 mount 후 내부 Filesystem 확인 
$ mkdir tmp1
$ sudo mount -o loop,offset=$((512 * 204800)) data.img ./tmp1  //loop device 사용 
or 
$ sudo mount -o ro,offset=$((512*204800)) data.img ./tmp1 // read only 
$ ls ./tmp1/
lost+found
$ umount tmp1 

//5. MBR을 제외한 부분 1*512 ~ 512*204800  각 Image 복사 default bs 는 512 bytes 
$ sudo losetup -o0 /dev/loop0 ./data.img     //attach device (0 byte에 연결) 
$ dd if=tmp1 of=data.img seek=1  //seek=01 , tmp1 파일을 data.img 01 x 512 byte 부터 복사 
$ dd if=tmp2 of=data.img seek=31 //seek=31 , tmp2 파일을 data.img 31 x 512 byte 부터 복사
$ dd if=tmp3 of=data.img seek=63 //seek=31 , tmp2 파일을 data.img 63 x 512 byte 부터 복사 
$ sudo losetup -d /dev/loop0   //detach device

  • 상위 data.img 구성 (fdisk사용시만)
  1. 0~512 byte : MBR ( Partition 정보)
  2. 01 x 512 ~ 31 x 512 : tmp1
  3. 31 x 512 ~ 63 x 512 : tmp2
  4. 63 x 512 ~ 31 x 512 : tmp3

GPT의 경우 parted 사용하며, 이부분은 Partition 구성이 다르므로 생략 

dd 사용예제
  https://ahyuo79.blogspot.com/2014/08/tmp.html
  https://ahyuo79.blogspot.com/2014/08/odroid-build2.html


dd 명령어 관련내용 
  http://wiki.linuxquestions.org/wiki/Some_dd_examples
  https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/
  http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip
  https://en.wikipedia.org/wiki/Dd_(Unix)
  https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/


2. hexdump/hd 기본사용법 

dd와 함께 data를 검증하기 위해서 사용해보자

  • hd/hexdump 옵션
  1. -s offset
  2. -n length
  3. -v display all input data.
  • hexdump 옵션
  1. -C hex와 ascii 값도 출력 


$ hd -s 512 -n 1024 -v data.img  // 512byte 부터 길이 1024 bytes 만 보기 

00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000220  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000230  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000240  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
........

$ hd -n 512 -v data.img  // 앞에 512 byte만 보기 

$ hd -v data.img  // 전체보기 

$ hd data.img | less // 전체를 보지만 less로 위치이동가능 (g 와 line 입력)

2/23/2017

Proc 기본정보 사용 (추후 수정)

1. proc 기본정보


  • boot parameter or kernel argument 확인 

$ cat /proc/cmdline 
console=ttyO0,115200n8 root=PARTUUID=000390f5-02 rw rootfstype=ext4 rootwait


  • 현재 사용중이 Partition 들을 확인 가능

$ cat /proc/partitions

   1        0      65536 ram0
   1        1      65536 ram1
   1        2      65536 ram2
   1        3      65536 ram3
   1        4      65536 ram4
   1        5      65536 ram5
   1        6      65536 ram6
   1        7      65536 ram7
   1        8      65536 ram8
   1        9      65536 ram9
   1       10      65536 ram10
   1       11      65536 ram11
   1       12      65536 ram12
   1       13      65536 ram13
   1       14      65536 ram14
   1       15      65536 ram15
   8        0   31457280 sda
   8        1   27348992 sda1
   8        2          1 sda2
   8        5    4105216 sda5
   8       16   31457280 sdb
   8       17   31456256 sdb1
   8       32   31457280 sdc
   8       33   31456256 sdc1
   8       48    4194304 sdd
   8       49      71680 sdd1
   8       50    4105216 sdd2


  • CPU와 Memory 정보

$ cat /proc/meminfo
MemTotal:        3960996 kB
MemFree:         2002696 kB
MemAvailable:    3665304 kB
Buffers:          375672 kB
Cached:          1150728 kB
SwapCached:            0 kB
Active:          1418624 kB
Inactive:         288124 kB
Active(anon):     181164 kB
Inactive(anon):     7332 kB
Active(file):    1237460 kB
Inactive(file):   280792 kB
Unevictable:           0 kB
....


$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model  : 60
model name : Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
stepping : 3
cpu MHz  : 2494.226
cache size : 6144 KB
....


$ cat /proc/kallsyms | less  // Kernel Symbol Table 
0000000000000000 A exception_stacks
0000000000000000 A gdt_page
0000000000000000 A espfix_waddr
0000000000000000 A espfix_stack
0000000000000000 A cpu_info
0000000000000000 A cpu_llc_shared_map
0000000000000000 A cpu_core_map
0000000000000000 A cpu_sibling_map
0000000000000000 A cpu_llc_id
0000000000000000 A this_cpu_off
0000000000000000 A cpu_number
0000000000000000 A x86_bios_cpu_apicid
...


$ cat /proc/interrupts  // interrupt information 
           CPU0       CPU1       CPU2       CPU3       
  0:         35          0          0          1   IO-APIC   2-edge      timer
  1:          0          0          0          9   IO-APIC   1-edge      i8042
  8:          0          0          0          0   IO-APIC   8-edge      rtc0
  9:          0          0          0          0   IO-APIC   9-fasteoi   acpi
 12:          0          0          0        156   IO-APIC  12-edge      i8042
 14:          0          0          0          0   IO-APIC  14-edge      ata_piix
 15:          0          0          0          0   IO-APIC  15-edge      ata_piix
 19:          0          0      36462        194   IO-APIC  19-fasteoi   ehci_hcd:usb1, eth0
 20:          0          0          0       7371   IO-APIC  20-fasteoi   vboxguest
 21:          0          0          0      62967   IO-APIC  21-fasteoi   0000:00:0d.0, snd_intel8x0
 22:          0          0          0         27   IO-APIC  22-fasteoi   ohci_hcd:usb2
NMI:          0          0          0          0   Non-maskable interrupts
LOC:     191624     195228     268926     116236   Local timer interrupts

...




PROC 정보
  https://en.wikipedia.org/wiki/Procfs
  https://ko.wikipedia.org/wiki/Procfs
  https://wiki.kldp.org/Translations/html/SysAdminGuide-KLDP/x1087.html#AEN1105
  https://www.joinc.co.kr/w/Site/system_programing/proc/GetSMSInfo

PROC 세부내역
  https://www.kernel.org/doc/Documentation/filesystems/proc.txt
  http://man7.org/linux/man-pages/man5/proc.5.html
PROC 등록예제
  https://wiki.kldp.org/wiki.php/ProcfsGuide
  http://sym4975.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-proc-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0%ED%8D%BC%EC%98%B4



Kernel 정보확인 hex값 이용

$ dd if=/proc/kcore | hexdump -C | less
$ sudo dd if=/proc/kcore | hd | less 



  http://wiki.linuxquestions.org/wiki/Some_dd_examples

mount 를 치면 현재 mount 된 정보가 나옴

$ mount 
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none on /sys/fs/pstore type pstore (rw)
.....


PS/TOP/VMSTAT
  http://cloudsemina.com/index.php?mid=linux&document_srl=163

재미있는 linux program 유용한 UTIL (추후 분리)
  http://cloudsemina.com/index.php?mid=linux&document_srl=296

TOP/LESS/MORE
  http://webdir.tistory.com/142

3/09/2016

Shell Script의 Sed 와 AWK (수정중)

1. Shell Script 기본예제 

기존보다 더 정리가 잘된 사이트를 찾음
  https://blog.gaerae.com/2015/01/bash-hello-world.html
  https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php

2. sed 기본사용

sed(stream editor) 약자이며, 흔히 Shell Script or vim에서 사용되는 교환 command이다.

문자열을 치환하거나 삭제할때 많이 사용되어지고 있다.
현재 간단히 테스트만 해보고 자세한 부분은 추후 시간이 될때 테스트해봐가면 익히자


$ vi test.sh 
#!/bin/bash

STR1="abc"
STR2="abc"
STR3="abc"

echo "Check STRING:  $STR1 $STR2 $STR3"
$ cp test.sh test1.sh

$ bash test.sh
Check STRING:  abc abc abc

$ sed -i 's/abc/def/g' test1.sh //  test.sh 파일에서 abc -> def 변환 한 후 저장 (미출력)
$ bash test1.sh
Check STRING:  def def def

$ sed 's/abc/def/g' test.sh   //  test.sh 파일에서 abc -> def 변환한 것을 화면에 출력만 하고 변경사항 test.sh 미저장 
#!/bin/bash

STR1="def"
STR2="def"
STR3="def"

echo "Check STRING:  $STR1 $STR2 $STR3"


관련링크 (설명이 잘되어있음)

  https://en.wikipedia.org/wiki/Sed
  http://vim.wikia.com/wiki/Search_and_replace
  http://milli.tistory.com/14

  https://www.shellscript.sh/variables2.html

3. awk 사용

Shell Script 혹은 명령어를 사용 도중에 특정 Column의 Row의 출력을 하고 싶을때 유용한것 같다
이밖에 다양한 기능이 있는 것 같은데, 좀 더 익숙해지면 익히자


$ df | awk 'NR == 2 {print $4}'    // NR Column , print $4 Row 
$ df | awk 'NR == 1 {print $4}'                         


관련링크 (설명)
  https://en.wikipedia.org/wiki/AWK
  https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
  http://ra2kstar.tistory.com/153
  http://www.thegeekstuff.com/2010/01/awk-tutorial-understand-awk-variables-with-3-practical-examples


10/14/2015

tree 와 aview / figlet (그림/문자표현) , rig (주석)

1. tree 명령

tree 형식으로 보여주는 command이며 기본적으로 설치되어 있지 않으며, 아래와 같이 별도로 설치하고 진행하자

$ sudo sudo apt-get install tree 
$ man tree
       tree [-adfghilnopqrstuvxACDFNS] [-L level [-R]] [-H baseHREF] [-T title] [-o filename] [--nolinks] [-P pattern] [-I pattern] [--inodes] [--device] [--noreport] [--dirsfirst] [--version]
       [--help] [--filelimit #] [directory ...]
SORTING OPTIONS
       -v     Sort the output by version
       -r     Sort the output in reverse
       -C     Turn colorization on always,
XML/HTML OPTIONS
       -X   : Turn on XML output
GRAPHICS OPTIONS
       -A     Turn on ANSI line graphics 
       -S     Turn on ASCII line graphics 

GRAPHICS OPTIONS
       -d     List directories only.
       -a     All files are printed. 
       -s     Print the size of each file
       -f     Prints the full path prefix 

       -L level
              Max display depth of the directory tree.


  • 사용법 
$ tree -d  //-d directory , 기본  ANSI Type , 현재기준  
.
├── Boot_Images
├── Filesystem
├── Media_Clips
│   ├── Audio
│   ├── Images
│   └── Video
└── START_HERE
    └── Setup_files

$ tree -X                // XML 로 전환 
.. XML 로 전환 ... 

$ tree -L 2             // Level을 설정하여 Tree의 단계를 설정 
....

$ tree -d -L 2 -A       //-d directory만 표시하고 -L를 이용하여 Level 제한 -A ANSI Type으로 표시 
....

$ tree -d  -A ./tools   // -d directory 와 -A ANSI Type 
...
$ tree -a ./tools   // -a 모든 File 
...
$ tree -as -A ./tools // File Size 

$ tree -t -L 1 --charset unicode     // -chartset Unicode 로 변경 
....

$ tree -t -L 1 --charset utf8        // -chartset utf8 로 변경 
...


2. aview/asciiview 명령

그림파일(아이콘)을 아래와 같이 문자로 변경하여 보여주며, 이를 소스에 적용하기가 좋은 명령어이다.

$ sudo sudo apt-get install aview
$ man aview
       aview [options] filename.p[ngbp]m
       asciiview [options] filename.xxx

       a,w,d,x
              Move the image one row/column.
       Z,+    Zoom in.
       z,-    Zoom out.
       q      Quit the viewer.



  • 사용법

 $ asciiview /media/sf_SHARED/20180625000155_0.jpg 



3. figlet/banner/toilet 명령 

3개의 command의 기능이 동일하며, 목적은 글자를 그림으로 표현해주는 명령어들이다.
사용설명법은 생략.

$ sudo sudo apt-get install figlet
$ sudo apt-get install sysvbanner
$ sudo apt-get install toilet


  • 사용법
가장 맘에 드는 것은 figlet 프로그램이며, 다른것은 그냥 그렇다.

$ figlet  HelloWorld
 _   _      _ _    __        __         _     _ 
| | | | ___| | | __\ \      / /__  _ __| | __| |
| |_| |/ _ \ | |/ _ \ \ /\ / / _ \| '__| |/ _` |
|  _  |  __/ | | (_) \ V  V / (_) | |  | | (_| |
|_| |_|\___|_|_|\___/ \_/\_/ \___/|_|  |_|\__,_|

$ banner HelloWorld
#     #                                 #     #
#     #  ######  #       #        ####  #  #  #   ####   #####   #       #####
#     #  #       #       #       #    # #  #  #  #    #  #    #  #       #    #
#######  #####   #       #       #    # #  #  #  #    #  #    #  #       #    #
#     #  #       #       #       #    # #  #  #  #    #  #####   #       #    #
#     #  #       #       #       #    # #  #  #  #    #  #   #   #       #    #
#     #  ######  ######  ######   ####   ## ##    ####   #    #  ######  #####

$ toilet HelloWorld
                                                                      
 m    m        ""#    ""#          m     m               ""#        # 
 #    #  mmm     #      #     mmm  #  #  #  mmm    m mm    #     mmm# 
 #mmmm# #"  #    #      #    #" "# " #"# # #" "#   #"  "   #    #" "# 
 #    # #""""    #      #    #   #  ## ##" #   #   #       #    #   # 
 #    # "#mm"    "mm    "mm  "#m#"  #   #  "#m#"   #       "mm  "#m##


4. rig 명령 

가짜 이름 /주소/ 전화번로를 생성해주며, 처음 소스에 넣어 주면 편할 꺼 같다.

$ sudo apt-get install rig
$ rig
Donovan Armstrong
492 Old Pinbrick Dr
Sunnyvale, CA  94086
(408) xxx-xxxx


  http://cloudsemina.com/index.php?mid=linux&document_srl=295

7/12/2015

Ubuntu Package 검색/설치/제거 방법

1. Ubuntu 의 Package 관리  

Ubuntu Linux는 Debian Linux 계열로 Linux로 *.deb 방식으로 package를 관리한다.
이에 관련된 Command는 dpkg 과 apt-x tool을 지원한다.
DPKG(Debian Package management system)는 의미 하며, APT(Advanced Packaging Tool)의 의미이다.

  https://wiki.debian.org/ko/DebianPackageManagement

  • dpkg command
  1. dpkg은  package를 설치/검색/제거가 가능한 Command이며, 대신 *.deb 만 가능 

  • APT Command 관련 명령어
  1. apt-get : package 설치/제거 및 Package Index update 기능, 및 Package check 
  2. apt-cache : repository package 검색 및 설치된 Package 검색 , 의존성 검사 
  3. add-apt-repository : repository 추가 및 제거 

  • DPKG(Debian Package) 과 APT(Advanced Packaging Tool) 관련 Tool 비교 
dpkg command 는 Debian Linux에서 사용하는 패키지 관리시스템이며, 설치가 될 경우 *.deb로 관리하여 이를 설치/제거 되어진다.
APT(Advanced Packaging Tool)도 역시 기존의 *.deb은 설치/제거를 하며 보다 쉽게 설치 가능하다.

  https://en.wikipedia.org/wiki/Dpkg
  https://en.wikipedia.org/wiki/APT_(Debian)

  • 관련 Man Page
  https://linux.die.net/man/8/apt-get      // FILE 부분에서 관련 저장소 및 다른 명령확인
  https://linux.die.net/man/8/apt-cache   // FILE 부분에서 관련 저장소 및 다른 정보확인
  http://manpages.ubuntu.com/manpages/precise/man1/add-apt-repository.1.html


1.1. apt-get/apt-cache 기능확인


  • apt-get 사용법
Package를 설치/제거기능 기본이며, Package Index update 및 종속되어지 Package 제거기능, Source/Binary Download 및 의존성체크 기능

$ sudo apt-get 

apt-get은 패키지를 다운로드하고 설치하는 간단한 명령입니다.
가장 많이 사용하는 명령은 update 명령과 install 명령입니다

Commands:
   update - 새 패키지 목록 가져오기 (package index files 를 update 진행)
   upgrade - 업그레이드 실행  (기존 설치된 Package를 Upgrade 진행)
   install - 새 피키지 설치 (패키지 이름은 확장자를 제외함)
   remove - 패키지 제거 
   autoremove - 사용하지 않는 모든 패키지를 자동으로 제거 (거의 사용할일은 없음)
   purge - 패키지와 설정 파일을 함께 제거 (Package 중 종속된 Package가 있는 경우 같이 제거)
   source - 소스 압축 파일 다운로드
   build-dep - 소스 패키지의 빌드 의존성 설정 (의존성 검사후 설치진행)
   dist-upgrade - 배포판 업그레이드  
   dselect-upgrade - dselect 선택 따르기
   clean - 다운로드한 압축 파일 지우기
   autoclean - 다운로드한 압축 파일 중 오래된 것 지우기
   check -의존성이 깨진 패키지를 확인합니다
   changelog - 주어진 패키지의 바뀐 내용 목록을 다운로드한 후 표시
   download - 현재 디렉터리로 바이너리 패키지 다운로드

Options:
  -h  이 도움말.
  -q  기록할 수 있는 출력 - 작업 알리미 없음
  -qq 올 이외의 메시지 표시하지 않기
  -d  압축 파일을 설치하거나 압축 해제하지 않고 다운로드만 하기
  -s  동작 없음. 명령 시뮬레이션 실행
  -y  모든 질문을 표시하지 않고 예라고 대답하기
  -f  망가진 의존성 패키지가 있는 시스템을 즉시 정정하려 합니다.
  -m  압축 파일을 찾을 수 없어도 계속 진행하도록 합니다
  -u  업그레이드한 패키지의 목록도 표시합니다.
  -b  소스 패키지를 가져온 후 빌드합니다
  -V  자세한 버전 번호 표시
  -c=? 지정한 설정 파일 읽기
  -o=? 임의의 옵션을 설정합니다, 예를 들어 -o dir::cache=/tmp
더 자세한 정보는 apt-get(8), sources.list(5) and apt.conf(5) 메뉴얼 페이지
를 확인하십시오.


  • apt-cache 기본기능
이미 설치된/ 설치될 package 정보확인 및 package 의존성 등 다양한 부가 기능을 제공

$ sudo apt-cache 
Usage: apt-cache [options] command
       apt-cache [options] showpkg pkg1 [pkg2 ...]
       apt-cache [options] showsrc pkg1 [pkg2 ...]

apt-cache is a low-level tool used to query information from APT's binary cache files

Commands:
   gencaches - Build both the package and source cache
   showpkg - Show some general information for a single package
   showsrc - Show source records
   stats - Show some basic statistics
   dump - Show the entire file in a terse form
   dumpavail - Print an available file to stdout
   unmet - Show unmet dependencies
   search - Search the package list for a regex pattern
   show - Show a readable record for the package
   depends - Show raw dependency information for a package
   rdepends - Show reverse dependency information for a package
   pkgnames - List the names of all packages in the system
   dotty - Generate package graphs for GraphViz
   xvcg - Generate package graphs for xvcg
   policy - Show policy settings

Options:
  -h   This help text.
  -p=? The package cache.
  -s=? The source cache.
  -q   Disable progress indicator.
  -i   Show only important deps for the unmet command.
  -c=? Read this configuration file
  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp

apt-get으로 설치된 package는 *.deb으로 되어있기때문에 dpkg 명령도 가능하며, dpkg기능도 설치 및 제거도 가능하지만 이곳에서 생략. 자세한 내용은 man or --help로 참조



  • add-apt-repository 
apt command는 remote repository ,server를 가지고 있으며, /etc/apt/source.list or /etc/apt/souce.list.d/  에 관련 repository 주소와 설정을 담고 있다.


$ add-apt-repository --help
Usage: add-apt-repository 

add-apt-repository is a script for adding apt sources.list entries.
It can be used to add any repository and also provides a shorthand
syntax for adding a Launchpad PPA (Personal Package Archive)
repository.

 - The apt repository source line to add. This is one of:
  a complete apt line in quotes,
  a repo url and areas in quotes (areas defaults to 'main')
  a PPA shortcut.
  a distro component

  Examples:
    apt-add-repository 'deb http://myserver/path/to/repo stable myrepo'
    apt-add-repository 'http://myserver/path/to/repo myrepo'
    apt-add-repository 'https://packages.medibuntu.org free non-free'
    apt-add-repository http://extras.ubuntu.com/ubuntu
    apt-add-repository ppa:user/repository
    apt-add-repository multiverse

If --remove is given the tool will remove the given sourceline from your
sources.list


Options:
  -h, --help            show this help message and exit
  -m, --massive-debug   명령줄에 많은 디버그 정보 출력
  -r, --remove          sources.list.d 디렉터레 안의 저장소 제거
  -k KEYSERVER, --keyserver=KEYSERVER
                        키 서버 주소입니다. 기본값: hkp://keyserver.ubuntu.com:80/
  -s, --enable-source   저장소에서 소스 패키지를 다운로드할 수 있도록 합니다.
  -y, --yes             모든 질의예 동의


  https://help.ubuntu.com/community/Repositories/Ubuntu


1.2. APT 명령 / DPKG 명령 기본사용법

  • apt-get install/remove/purge package (package 설치/제거) 
$ sudo apt-get install   pkg                      // pkg 패키지 설치
$ sudo apt-get remove pkg                         // pkg 패키지 제거
$ sudo apt-get purge pkg                          // pkg 는 물론 관련 패키지까지 삭제 (명령어가 생성)
$ sudo apt-get source pkg                         // pkg source download


오래된 Ubuntu Version는 purge가 remove에 포함되어있다.

  • apt-cache show/search package  (설치할 package 정보 및 검색) 
$ sudo apt-cache show pkg                         // 설치할 pkg 패키지 정보
$ sudo apt-cache search pkg                       // 설치할 pkg 패키지 검색


  • apt-cache depend package  (설치전 or 설치후 의존성확인 가능)
설치는 되었지만, Package가 제대로 동작이 되지 않는다면, 이 의존성확인으로 확인하자.
특히 현재 x86과 64bit version 충돌 발생할 수 있으며, 다른 문제도 발생할 수 있으니, 확인

$ sudo apt-cache depends zlib1g-dev:i386  // 의존성확인 의 예 
zlib1g-dev:i386
  의존: zlib1g:i386
 |의존: libc6-dev:i386
  의존: libc-dev:i386
    libc6-dev:i386
  충돌: zlib1-dev
  충돌: zlib1-dev:i386
  대체: zlib1g-dev
  망가뜨림: zlib1g-dev  


1.2.1. apt-get update와 upgrade의 차이 


  • apt-get update 
repository 주소정보가 있는 패키지 정보리스트( /etc/apt/source.list)에서 각 repository에서 package index file을 repository와 sync를 맞추는 작업일 뿐이다.  
package을 설치는 package index file에 존재해야 설치가 가능하며, 이는 package 에는 영향을 미치지 않는다.

- 관련파일 /etc/apt/source.list or /etc/apt/source.list.d


  • apt-get upgrade
현재 설치된 package를 version upgrade하는 명령으로 설치된 package를 가능한 최신 version으로 변경하는 upgrade기능


$ sudo apt-get update       //현재 Package index file을 repository와 sync (update)    
$ sudo apt-get upgrade      // 설치된 패키지를 새버전으로 Upgrade.    


  • 주의사항 
Ubuntu를 바로 설치했거나,  설치되어진지 오래되었다면 update 를 반드시 해야한다. 않을 경우 원하는 package 정보를 찾지 못하는 경우가 발생한다.


2. Ubuntu의 repository 추가/삭제  

Ubuntu에서는 처음 설치후 외부의 Repository를 통해 각각 Package를 추가 및 업그레이드를 진행을 한다.

2.1. Ubuntu Version CodeName 알기 

Android 처럼 Ubuntu역시 각각 Version마마 Code Name이 별도로 존재하며, 설정을 할때,이를 제대로 인지해야 무슨 Version인지 본인이 안다.

  • Ubuntu Release Version 과 Code Name 알기 
  1. 12.04 LTS precise
  2. 14.04 LTS trusty

  자세한 내용은 아래사이트 참고
  https://wiki.ubuntu.com/Releases


2.2. Ubuntu Command를 통해 Repository 관리 

add-apt-repository를 이용하여 repository 추가 및 제거가능하며, 추가된 사항을 상위 두곳의 source.list에서 확인가능


  • Repository의 주소 및 설정확인 
  1. /etc/apt/sources.list   repository 주소 추가  및 제거가능 
  2. /etc/apt/sources.list.d/file 형태로 repository 주소 추가 (ppa 사용시 이곳에 추가)

  • /etc/apt/source.list  설정 이해 
4가지의 main repository 의 설정이며, 중복설정가능
  1. Main - Canonical-supported free and open-source software. (Ubuntu에서 제공하는 Open source)
  2. Universe - Community-maintained free and open-source software.(커뮤니티기반의 Open source)
  3. Restricted - Proprietary drivers for devices.(자산으로 인정하는 디바이스 드라이버 )
  4. Multiverse - Software restricted by copyright or legal issues.(라이센스/법적 제한된 소프트웨어)

1번/2번은 Open source지만 안정성에서 보면 Ubuntu 기본제공과 유저기반제공
3번은 Device Driver의 개발업체의 법적책임과 관리를 개발업체가 관리하지만, Package 제공
4번은 라이센스 및 법적제한이 된 것으로 주의필요



$ sudo vi /etc/apt/source.list
deb http://kr.archive.ubuntu.com/ubuntu/ trusty main restricted       # package repository , trusty: ubuntu version 
deb-src http://kr.archive.ubuntu.com/ubuntu/ trusty main restricted   # source repository 

## Major bug fix updates produced after the final release of the distribution. (내부 주석에 설명 trusty-updates)
deb http://kr.archive.ubuntu.com/ubuntu/ trusty-updates universe      # package repository   
deb-src http://kr.archive.ubuntu.com/ubuntu/ trusty-updates universe  # source repository    

## trusty-backports , 내부주석에 설명 
deb http://kr.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://kr.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse

  • add-apt-repository  사용법

lucid (Ubuntu 10.04)

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo vi /etc/apt/sources.list 
## check your list 


jaunty(Ubuntu 9.04)

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ jaunty multiverse"  
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ jaunty-updates multiverse" 
$ sudo apt-get update
$ sudo vi /etc/apt/sources.list  
   ## check your list  


2.2.1. PPA(Personal Package Archives) 사용 

add-apt-repository는 Repository를 추가시 PPA라는 기능을 제공하며, PPA's Launchpad page에서 찾어 아래의 format으로 Repository를 추가한다.
결론적으로 직접 Repository 주소를 입력하는 것이 아니라 directory를 입력하며,실제주소는 위에서 언급했듯이 PPA's Launchpad page에서 찾는다.

man을 읽어보면,  /etc/apt/sources.list 추가 되거나 /etc/apt/sources.list.d/file (full path사용)추가된다고 하며, GPG public key도 download된다고 한다.

  • PPA's Launchpad page 정보 
$ ls /etc/apt/sources.list.d/
brightbox-ruby-ng-trusty.list  docker.list                    git-core-ppa-trusty.list       git-core-ppa-trusty.list.save 

$ vi /etc/apt/sources.list.d/brightbox-ruby-ng-trusty.list 
deb http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu trusty main
# deb-src http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu trusty main

  • 기본 사용예제 
ppa:[username]/[ppaname] format 추가 (repository의 directory 추가)


$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update  
$ sudo vi /etc/apt/sources.list.d/...  


  • 공식 PPA 사이트
아래사이트에서 ARCH에 따라 본인이 원하는 package를 검색해본다.
  https://launchpad.net/ubuntu/+ppas

PPA for Ubuntu Korea Community
  https://launchpad.net/~ubuntu-ko/+archive/ubuntu/ppa

기타예제
  http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu/
  http://webdir.tistory.com/197


2.3 Ubuntu GUI에서 Package 관리지원

Window 처럼 자동 Upgrade 기능처럼 GUI에서도 이런 기능을 제공.

  • GUI에서 설정->소프트웨어&업데이트 확인가능 



  https://help.ubuntu.com/community/Repositories/Ubuntu

3. 설치된 Package 관련정보분석 

이미 Ubuntu의 설치된 Package들을 검색하고, 로그 분석하는 법을 알아보자.

  • dpkg package (설치된 package 정보 및 검색) 
$ sudo dpkg -l                                    // 현재 전체 설치된 패키지 정보 , (시간검색이 안됨 ) 
$ sudo dpkg -l  | grep pkg                        // 현재 설치된 패키지 검색

  • dpkg package (설치된 PKG 로그 분석) 
package가 설치될 경우 아래와 같이 로그가 생성

$ ls /var/log/dpkg.log*   // 설치된 Package의 로그들  
/var/log/dpkg.log        /var/log/dpkg.log.11.gz  /var/log/dpkg.log.4.gz  /var/log/dpkg.log.7.gz
/var/log/dpkg.log.1      /var/log/dpkg.log.2.gz   /var/log/dpkg.log.5.gz  /var/log/dpkg.log.8.gz
/var/log/dpkg.log.10.gz  /var/log/dpkg.log.3.gz   /var/log/dpkg.log.6.gz  /var/log/dpkg.log.9.gz

$ cat /var/log/dpkg.log | tail -n 30  // 최근 설치된 Package 로그확인 (*.deb 기준)

$ cat /var/log/apt/history.log | tail -n 30  // apt history 로그확인


  • smbclient package를 설치했다고 아래와 같이 검색 
$ grep install /var/log/dpkg.log                  // grep를 이용하여 install (설치된 패키지) 검색 , 설치된 시간이 검색가능 
$ grep install /var/log/dpkg.log /var/log/dpkg.log.1
$ ls /var/lib/dpkg/info/*.list  | grep smbclient    // smbclient package 설치된 Directory들을 확인가능 
$ ls /var/cache/apt/archives/ | grep smb*           // 설치된 *.deb package를 찾아볼수 있다. 
pkg: package name 

  https://unix.stackexchange.com/questions/12578/list-packages-on-an-apt-based-system-by-installation-date

4/09/2015

pushd 와 popd로 반복 directory 이동

1. pushd 와 popd의 기능

Linux에서 cd 를 이용하여 잦은 directory를 이동하면 사실 귀찮으며, 이동한 기록을 이용하여 이동을 하면 편할 때가 많다.

  • pushd 
stack 구조로 history를 저장하고 cd 명령처럼 이동을 하며, 본인의 옵션에따라 써클큐처럼 동작하여 순환이동이 가능하다.

  1. pushd path : 해당 path를 pushd에 Stack으로 기록과 동시에 이동후 Stack 기록
  2. pushd        : stack에 있는 이전 path로만 이동, 반복이동가능 (Stack Size 동일)
  3. pushd +1   : stack을 써클큐로 이용하여 현재주소 n번째 path로이동 (Stack Size 동일)


  • popd 
popd는 pushd로 기록된 history 중에 필요없는 기록을 지우는 기능으로 사용된다.

  1. popd     :   stack의 이전주소 이동후 stack 이전주소삭제
  2. popd -n  :  현재기준으로 1번째주소만 삭제 (현재주소 유지)
  3. popd +3 :  현재기준으로 3번째 주소만 삭제 (현재주소 유지)


가능하다면 -n 옵션과 -N 옵션은 사용하지 말자.
+N 옵션만 직접번호 넣고해야 사용해야 기억하기 쉽다. 

1.1 pushd를 이용하여 stack 정보생성

$ pushd /var/log/                       // pushd 입력과 동시에 이동 
/var/log ~                              // Stack 정보표시 1개 (좌측 왼쪽은 현재위치)

$ pushd /etc                            // pushd 입력과 동시에 이동                        
/etc /var/log ~                         // Stack 정보표시  2개 (좌측 왼쪽은 현재위치) 

$ pushd /opt                            // pushd 입력과 동시에 이동
/opt /etc /var/log ~                    // Stack 정보표시 3개 (좌측 왼쪽은 현재위치) 

$ pushd /bin                             // pushd 입력과 동시에 이동
/bin /opt /etc /var/log ~                // Stack 정보표시 4개 (좌측 왼쪽은 현재위치) 

$ pushd /mnt                             // pushd 입력과 동시에 이동
/mnt /bin /opt /etc /var/log ~           // Stack 정보표시 5개 (좌측 왼쪽은 현재위치) 

$ pushd /proc                             // pushd 입력과 동시에 이동
/proc /mnt /bin /opt /etc /var/log ~      // Stack 정보표시 6개 (좌측 왼쪽은 현재위치) 

   Stack 정보는 현재위치도 포함

1.2 두 주소만 반복이동

  • 기존기록 
$ pushd                                      // 상위의 마지막 Stack 정보    
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)


  • pushd 이용 사용예 
        현재위치기준으로 +1번째만 이동 (반복이동)

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/mnt /proc /bin /opt /etc /var/log ~         // 이전주소 (/mnt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/mnt /proc /bin /opt /etc /var/log ~         // 이전주소 (/mnt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)


1.3 Stack 정보를 써클큐로 순환이동 

  • 기존기록 
$ pushd                                      // 상위의 마지막 Stack 정보    
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)


  • push +N 이용  
       현재위치기준으로 +N 번째  (순환이동)

$ pushd +1                                   // 1번째 전주소(/mnt)이동과 써클큐로 동작 (Stack Size동일)   
/mnt /bin /opt /etc /var/log ~ /proc         // 1번째 전주소(/mnt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd +1                                   // 1번째 전주소(/bin)이동과 써클큐로 동작 (Stack Size동일)   
/bin /opt /etc /var/log ~ /proc /mnt         // 1번째 전주소(/bin) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd +1                                   // 1번째 전주소(/opt) 이동과 써클큐로 동작 (Stack Size동일)   
/opt /etc /var/log ~ /proc /mnt /bin         // 1번째 전주소(/opt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd +1                                   // 1번째 전주소(/etc) 이동과 써클큐로 동작 (Stack Size동일)   
/etc /var/log ~ /proc /mnt /bin /opt         // 1번째 전주소(/etc) 이동된 (좌측 왼쪽은 현재위치)  

$ pushd +2                                   // 2번째 전주소(/~)이동과 동시에 써클큐로 동작 (Stack Size동일)     
~ /proc /mnt /bin /opt /etc /var/log         // 2번째 전주소(/~) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd +2                                   // 2번째 전주소(/mnt)이동과 동시에 써클큐로 동작 (Stack Size동일)     
/mnt /bin /opt /etc /var/log ~ /proc         // 2번째 전주소(/mnt) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd +2                                   // 2번째 전주소(/opt)이동과 동시에 써클큐로 동작 (Stack Size동일)     
/opt /etc /var/log ~ /proc /mnt /bin         // 2번째 전주소(/opt) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd +5                                   // 5번째 전주소(/mnt)이동과 동시에 써클큐로 동작 (Stack Size동일)    
/mnt /bin /opt /etc /var/log ~ /proc         // 이전주소 (/mnt) 이동된 (좌측 왼쪽은 현재위치)   

1.4 필요없는 Stack 정보 삭제 


  • 기존기록 
$ pushd                                      // 상위의 마지막 Stack 정보    
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)

  • popd 이용하여 삭제  
        현재위치기준으로 +N 번째 Stack 정보삭제

$ popd                              // 이전주소로 이동동시에 마지막현재주소 삭제 (/opt로 이동)
/mnt /bin /opt /etc /var/log ~      // 이전주소 이동됨 (좌측 왼쪽은 현재위치)

$ popd -n                           // popd로 현재기준으로 1번째주소만 삭제 (위치그대로) 
/mnt /opt /etc /var/log ~            // 현재주소 유지 (좌측 왼쪽은 현재위치)

$ popd +3                            // popd로 현재기준으로 3번째주소만 삭제 (위치그대로) 
/mnt /opt /etc ~                     // 현재주소 유지 (좌측 왼쪽은 현재위치)


  http://en.wikipedia.org/wiki/Pushd_and_popd
  http://devanix.tistory.com/231

2/26/2015

VI 편집기 수정중 (추후정리)

1. VI 편집기 

처음으로 리눅스 및 유닉스를 접하면서 다룬 편집기이며, 다루기도 복잡하지만 보편적인 편집기인 것 같다. 그래서 필수적으로 기본 명령어와 기본 설정정도는 알아둬야하는 것 같다.

1.1 VI,VIM의 기본설정  

  • VIM 설치 

$ sudo apt-get install vim 

  • 탭사이즈 조절 및 Line Number 설정
$ vi ~/.vimrc
set ts=4
set nu      
set ruler
set title
"  "주석  


set ts=4  :  tab size 설정
set nu     :   set number   좌측에 line number 표시
set ruler  :  현재 cursor 위치 표시


1.2 소스분석시 필요한 설정

$ sudo apt-get install ctags cscope 

  • CTAGS 추가  (./vimrc 변경) 
$ vi ~/.vimrc
set tags=./tags,tags    " 
set tags +=~/qtwork/kernel/tags           
"set tags+=~/am437x/works/board-support/u-boot-2014.07+gitAUTOINC+fb6ab76dad-gfb6ab76/tags
"set tags+=~/dm368/mt5/Source/dvsdk_ipnctools/ipnc_psp_03_21_00_04/kernel/tags
  • CSCOPE 추가  (./vimrc 변경) 
$ vi ~/.vimrc
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
if filereadable("./cscope.out")
    cs add cscope.out
else
    cs add /usr/src/linux/cscope.out
endif
set csverb

  • CSCOPE File 관련 생성 

$ vi mkcscope.sh
#!/bin/sh
rm -rf cscope.files cscope.files
find . \( -name ‘*.c’ -o -name ‘*.cpp’ -o -name ‘*.cc’ -o -name ‘*.h’ -o -name ‘*.s’ -o -name ‘*.S’ \) -print>cscope.files
cscope -i cscope.files


상위와 같이 실행하면, 자동으로 cscope가 실행이 되는데, 이때
ctrl+z 로 나가면 된다.

2. VIM의 모드구성

Normal Mode가 Default 이며, 다른모드에서 ESC를 클릭시 Normal로 돌아온다.

  1. Normal Mode : vi로 file open 했을 경우 처음 기본모드 (default)
  2. Insert   Mode : Normal 에서 'i' , 'a', 'o', 's'  입력시 편집가능
  3. Visual   Mode : Normal 'v'

  • Command 이용 및 sed와 유사한 기능 실행 

Normal Mode는 ':'를 이용하여 Command가 실행이 가능하며, sed와 같은 script도 가능하다
'/' 를 이용하여 정의하고 검색도 가능하다


  https://wiki.kldp.org/KoreanDoc/html/Vim_Guide-KLDP/Vim_Guide-KLDP.html
  http://idkwim.tistory.com/66

2.1 단축키 생성 및 치환기능 

Visual 모드에서 아래와 같이 각각의 명령을 이용하여 vi 내부에서 사용되는 기본명령 및 다른 기능들을 단축키로 대체 가능하다.

솔직히 거의 잘 사용하지 않으며,  그냥 알아두기만 하고 추후 사용할 일 있으때 그때보자.

nmap, map, vmap, imap,

일단 nmap에 대해 간단히 알아보자.
위의 visual mode에서 아래와 같이 실행을 해보자.

:nmap - dd
:nmap \ -

위와 같이 실행을 하면,  - 키를 입력하면 자동으로 dd가 실행이되어 한줄이 삭제된다.
\ 키를 입력을 하여도 동일하다.
nmap은 명령어를 mapping 시켜준다.

아래와 같이 실행을 하면, 위에서 mapping 했던 설정이 제거된다.

:nunmap -
:nunmap \


ex) :map _ ddp
'_'를 누르면 해당 줄을 아래로 내림

하지만 입력모드에서 언더스코어는 코딩할 때 자주 쓰이므로, 노멀모드에서만 동작하도록 해야 합니다. 이 때는 모드의 머릿글자+map 으로 동작 범위를 제한할 수 있습니다.

ex) :nmap _ ddp
그런데 만약, p 키를 다른 명령에 맵핑했다면 어떻게 될까요. _ 를 누르면 현재 줄을 삭제하고 p에 할당된 작업을 수행합니다. 따라서 맵핑을 작성할 때는 키시퀀스에 할당된 기능이 아닌 맵핑된 기능만을 처리하도록 해야 합니다.

:noremap _ ddp
noremap 은 키 시퀀스에 맵핑된 기능이 있어도 무시하고 디폴트 기능만을 수행하도록 합니다. 역시 모드의 머릿글자와 덧붙여서 조합이 가능합니다.
그러면 noremap 은 언제 사용해야 할까요? 언제 어떤 맵핑을 추가할지 모르니, "항상" 이렇게 사용해야 합니다.

:help nmap

관련 Manual

    http://learnvimscriptthehardway.stevelosh.com/chapters/05.html
    http://sunshowers.tistory.com/61
    http://jaeheeship.github.io/console/2013/11/15/vimrc-configuration.html


2.2 Command 기본실행 

Normal Mode에서 ':' 을 실행을 하면 sed와 같은 script 구사가 쉽게 가능하며,
':!'를 이용하여 Linux Command를 편집기 안에서 실행이 가능하다.


  • 문자열 치환기능 
기본기능은 sed와 동일하게 s/pattern/pattern/g   g는 전체의 의미
pattern 내부에 /가 존재한다면 \을 이용하여 구분해줘야 한다.

:1,10s/old/new/g :
:3,$s/old/new/g  : line3 부터 설정 끝까지 검색하고 치환
:s/old/new/g     :  전체 치환



  • 복사 및 이동 
Normal Mode에서 기본복사는 'yy'  or  '5yy' , 1줄 or 5줄 복사 하고 원하는 곳에 'p' 붙혀넣기 동작이다.
하지만 Command 이용하여 복사가 아래와 같이 가능하다.  
아래의 실행하기전에 : se nu로 line의 소스의 숫자를 확인하자.

: 1,5 co 7    : 1 ~5 을 line 7 기준으로 다음줄에 복사
: 1,5 t 7     : 1 ~5 을 line 7  기준으로 다음줄에 복사
: 2,4 m 7    : 2 ~4 을 line 7  기준으로 다음줄로 이동



  • 삭제기능 
Normal Mode에서 기본복사는 'dd' or '5dd' , 1줄 삭제 or 5줄 삭제가 가능하지만, Command를 이용하여 가능하다.

:5,10d     : 5~ 10 line 삭제

  • 검색기능 
Normal Mode에서 원하는 단어 위치에서 '*' 지속적으로 누르면 그 단어를 계속 찾아준다.
동일한 기능으로 '/pattern'  하고 'n'을 지속적으로 누르면 이를 지속적으로 찾는다.

define 찾기의 예제 
'/define' 입력 후  n 지속적입력  아래로 검색  'N' 반대방향
'?define' 입력 후  n 지속적입력  위로 검색    'N' 반대방향 


  • 뒤줄에 특수문자 "," 추가 

//1~10 line에 , 추가
:1,10s/$/\,/g

//전체 추가
:%s/$/\,/g


  • 앞줄에 추가 "foo:" 추가 
:10,20s/^/foo: /

:%s/^/foo: /




2.3 Command 확장 

vi가 window 처럼 이용이 되고 window의 다른 editor처럼 편하다면 좋겠지만, 이를 유사하게 사용이 가능하다.

  • Window 처럼 Tab 기능 사용 
vi 내부에서 여러문서를 읽고 편집하기위해서 tab 기능을 사용하며, 상위에 tab이 표시된다.

: tabnew  test.c  : 새로운 탭(문서창)을 작성한다.   ,
: tabnext           : 다음 탭(문서창)을 보여준다.
: tabprev           : 이전 탭(문서창)을 보여준다.
: tabclose          : 현재 탭(문서창)을 닫는다.


각 tab의 제거는 q! or x(save하고 exit) or tabclose 이지만 귀찮다.
위 명령은 길어서 사용하기 힘들다면,  vi ~/.vimrc 열어 단축 단어 설정하자.

$ vi ~/.vimrc
nmap th :tabprev
nmap tl :tabnext
nmap tn :tabnew       
nmap tc :tabclose

  http://vim.wikia.com/wiki/Using_tab_pages


  • 창 분할 
Tab기능과 별도로 현재의 창을 분할하여 File을 열고 닫을수도 있다.


:split 파일명    // 세로 창 분할  위아래 분할
:vs  파일명      // 가로 창 분할   좌우 분할
//Ctrl+w를 누른 후 w 창이동



  • 창분할 의 고급 (탐색기 처럼사용)
앞에 숫자를 넣으면 창의 크기가 결정이 되며, File 명 대신 Directory를 선택시 탐색기로이용


:30vs./     : 30은 세로창의 사이즈이며, ./ 디렉토리 열어 탐색기처럼 사용하여 File open
:split./     :  가로창을 현재 디렉토리 열어 탐색기처럼 사용하여 File open

  • HEX Editor (현재 많이 이용중)
 
:!%xxd
:!%xxd -r



3. Xshell 설정의 단축버튼설정 

Xshell에는 총 12개의 단축버튼이 있으며, vim을 사용할때 이 단축버튼을 각각의 기능에 연결하여 CTAGS/CSCOPE 사용하자.

 VIM에서 사용하는 CTAGS/CSCOPE 기능 
:tj  //TAG 검색
:sts tj   //새창 검색
:tn      //다음태그
:tp     //이전태그  
:tags   //태그 히스토리
:cs find c   // 부른함수
:cs find d   // 불려진함수 
:cs find s   // C심볼
:tabnew      // 새창 
:tabnext     // 다음탭
:tabprev     // 이전탭
:tabclose    // 탭닫기


단축버튼을 만들 경우 반드시 CR을 확인하자 (new line)



Xshell에서 도구->단축버트모음
별도저장 및 다른 기능을 저장


2/12/2015

xargs 기본사용

1. xargs 기본사용

xargs는 기본적으로 단독으로 사용하는 command가 아니며 다른 command과 조합으로 사용한다.

xargs에서 다른 command를 실행하면, 표준입력으로 값으로 들어온 값을 그대로 command로 넘겨준다. 그래서 이름 xargs 인 것 같다.
결론적으로 xargs의 command는 표준입력의 넘어온 list의 제한적인 검색 또는 실행을 한다.

$ find . -name "*.o" | xargs rm -rf  


SYNOPSIS
       xargs  [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]]
       [-L max-lines] [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s max-chars] [--max-chars=max-chars] [-P max-procs]  [--max-procs=max-procs]  [--interactive]  [--verbose]
       [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits] [--version] [--help] [command [initial-arguments]]


2. 기본예제


$ find . -name "*.o" | xargs rm -rf
$ ls "*.o" | xargs rm -rf

위 예제가 제대로 동작이 안될 때 아래와 같이 한다.
왜냐하면 find를 검색은 기본적으로 newline을 포함하지만 -print0 은 이를 제거한다.

$ find /tmp -name "*.tmp" -print0 | xargs -0 rm

  • 각 directory의 전체 사이즈를 알고 싶을 경우.

$ ls | xargs du -hs 

http://www.dreamy.pe.kr/zbxe/CodeClip/164220
http://www.thegeekstuff.com/2013/12/xargs-examples/

2/11/2015

grep 이용 검색

1. 기본사용법 

     grep은 기본사용법은 적은 찾고자 하는 패턴을 입력하고, 시작디렉토리를 입력하며, 검색을 시작한다.

     grep  option  expr  directory     // expr에 "" or ''을 넣어주어야 주어한다.

2. 기본옵션 

     -r 옵션은 순환적으로 밑에 디렉토리까지 검색하지만, 속도가 너무 느리다.
        만약 SSD이라면, 적극추천한다. 하지만 재귀에 문제로 너무 오래걸리는 것인지 동작이 멈춘 것인지 알수 없는 경우가 발생.

     -n output file의 line number를 알고 싶다면 -n으로 사용

     -b -n과 동일한 기능 같은데, newline이 포함안됨

     -E 옵션과 확장 패턴을 넣을수 있는데, 이때  AND 와 OR 연산을 사용가능.

       -E, --extended-regexp
              Interpret PATTERN as an extended regular expression
              * egrep과 동일하다고 한다. 

       -e PATTERN, --regexp=PATTERN
              Use PATTERN as the pattern.

       -b, --byte-offset
              Print the 0-based byte offset

       -n, --line-number
              Prefix each line of output with the 1-based line number 

       -R, -r, --recursive
              Read all files under each directory

       -v, --invert-match
              Invert the sense of matching, to select non-matching lines.

       -h, --no-filename
              Suppress the prefixing of file names on output.
              검색 list의 file 이름 제거

man에서 참고

3. 기본표현식 

     패턴은 regular expression이라고 부르며, 아래와 같은 meta-characters 사용이 가능하다.


   The period . matches any single character.

   Anchoring
       The caret ^ and the dollar sign $ are meta-characters that respectively match the empty string at the beginning and end of a line    

   Bracket Expressions
 
   [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:]
   [0-9] 
   [0-9A-Za-z] 
   [aBbCcDd]   
   [0123456789]

   Repetition
   A regular expression may be followed by one of several repetition operators:
       ?      The preceding item is optional and matched at most once.   
       *      The preceding item will be matched zero or more times.       
       +      The preceding item will be matched one or more times.       
       {n}    The preceding item is matched exactly n times.
       {n,}   The preceding item is matched n or more times.
       {n,m}  The preceding item is matched at least n times, but not more than m times.

man에서 참고

4. 사용확장 
  • OR 연산
$ grep 'pattern1\|pattern2' filename
$ grep -E 'pattern1|pattern2' filename
$ egrep 'pattern1|pattern2' filename
$ grep -e pattern1 -e pattern2 filename
  • AND 연산
     grep에는 AND연산이 없지만, 유사하게 사용이 가능. ( '|' 사용 및 -E 와 '.*' 사용)
$ grep -E 'pattern1.*pattern2' filename
$ grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
$ grep -E 'pattern1' filename | grep -E 'pattern2'
  • NOT 연산 
$ grep -v 'pattern1' filename


5. 사용예제들

아래의 사용예제들은 AND와 NOT , 그리고 OR 연산을 사용하며, -r을 사용한다.
그리고 위의 메타데이타를 사용하기에 쉽게 검색이 된다.
grep은 find에 비해 검색속도가 상당히 많이 느리지만, SSD에서는 적극 추천한다.

단독사용도 가능하지만, find와 조합도 가능하고 다양한 조합도 가능하기 사용자의 능력인것 간다.


$ grep -r 'i2c.*sm.*wri*' .  //i2c와 sm과 wri가 3개의 패턴검색 (위의 AND 연산)

$ grep -Er 'i2c.*sm.*wri*' .     //현재 위와 동일하다

$ grep -r 'i2c.*sm.*wri*' . | grep -v "block"  // 위를 일차검색하고, block을 제외 

$ grep -r 'i2c*' . | grep -v "block"  //i2c 관련 검색을 하지만 block 제외

$ grep -r 'i2c.*write[0-9]' .    //i2c와 write0~9까지 의 패턴을 검색. 

$ grep -r 'i2c.*write[0-9]' .    //i2c와 write0~9까지 의 패턴을 검색.

$ grep -rE '(i2c|spi).*write[0-9]' . //i2c 나 spi  둘 중  write0~9와 패턴이 중복되는 것 검색


아래의 사이트 참고,

  http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators/
  http://xero0212.tistory.com/26
  http://www.thegeekstuff.com/2009/03/15-practical-unix-grep-command-examples/

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

1/07/2015

find 검색

1. Find 기본사용법

find는 원하는 file을 찾을 경우 사용하며, file정보를이용하여 검색하기 때문에 grep보다 빠른 검색가능하다.


SYNOPSIS
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]


1.1.  Find 의 옵션  

Find는 FILE의 정보기준으로 검색을 하며, 다양한 옵션들을 제공하여 빨리 원하는 FILE들을 찾아준다.

  • Find 기본연산옵션
  1. FILE의 이름관련 연산
  2. FILE의 시간관련 연산 
  3. FILE의 사이즈관련 연산
  4. AND/OR/NOT 연산제공 :  상위 1/2/3번의 조합이 가능 

**SIZE 관련 연산

       -size n[cwbkMG]
              File uses n units of space.

              `b'    for 512-byte blocks (this is the default if no suffix is used)
              `c'    for bytes
              `w'    for two-byte words
              `k'    for Kilobytes (units of 1024 bytes)
              `M'    for Megabytes (units of 1048576 bytes)
              `G'    for Gigabytes (units of 1073741824 bytes)

**TIME 관련 연산  (time: 기본단위는 24*hours , min:  minutes)

        -mtime  n : modified n days ago         (파일의 내용을 변경시 )
        -mmin   n : modified minutes ago
        -atime  n : access   n days ago         (파일을 오픈했을 경우, cat, vi, grep, head )
        -amin   n : access   minutes ago  
        -ctime  n : changed  n days ago          (파일의  속성이 변경시)
        -cmin   n : changed  minutes ago

**SIZE/TIME의 숫자개념 

         -n  :  for less  than  ( < n )
         +n  :  for great than  ( > n )
          n  :  for exactly n   (  n )

상위 FILE의 SIZE 및 TIME 연산의 AND/OR/NOT 연산가능

**AND OR 연산 및 NOT 연산 

       -not expr
              Same as ! expr, but not POSIX compliant.

       expr1 expr2
              Two expressions in a row are taken to be joined with an implied "and"; expr2 is not evaluated if expr1 is false.

       expr1 -a expr2
              Same as expr1 expr2.

       expr1 -and expr2
              Same as expr1 expr2, but not POSIX compliant.

       expr1 -o expr2
              Or; expr2 is not evaluated if expr1 is true.

       expr1 -or expr2
              Same as expr1 -o expr2, but not POSIX compliant.

       expr1 , expr2
              List;

  • Find의 기타옵션 
  1. 다른 command 실행연산
  2. FILE 검색결과의 출력방법


**실행연산

       -exec command ;

**output 종류 

newline을 사용여부 및 프로그래밍으로 output을 만들수 있다 이 부분 man을 참고

       -print0
              True; print the full file name on the standard output, followed by a null character

       -print True; print the full file name on the standard output, followed by a newline.

       -printf format
              True;  print  format  on  the standard output,

              %p     File's name.

              %P     File's name with the name of the command line argument under which it was found removed.

              %s     File's size in bytes.

              %b     The amount of disk space used for this file in 512-byte blocks.

              %k     The amount of disk space used for this file in 1K blocks.


2. Find 예제 


2.1 FILE의 이름기준 검색 


* : 여러글자 대체
? : 한글자만 대체
[1-8] : 한글자만 정의 (1~8)
[a-c] : 한글자만 정의 (a~c)

$ find . -name  expr// 원하는 검색어 
$ find . -name '*.o'   // *.o 파일 검색  (가능하면 '' or ""사용) 
$ find . -name *.h    // *.h  파일 검색
$ find . -name *droid-[2-5]*  // android-2/4/5 검색
$ find . -name *droid-[2-5].[0-1]*  //e.g android-2.0 검색
$ find ./ -name '*aic*.o' // 중간에 aic 파일 검색


2.2 FILE의 시간기준 검색 

시간은 모두 과거의 기준으로 검색을 하기에 +- 모두 과거시간들과 검색한다.
다만 차이가 있다면 아래와 같이 n 에따라 -:less than or +:great than or 일치 있을 뿐이다.

$ find . -mtime -7             // 수정날짜 (n < 7   ) 현재 FILE(0) ~ 7일전 FILE 검색  
$ find . -mmin  30             // 수정시간 ( n         ) 오직 30분전 변경된 FILE 만 검색 
$ find . -mmin  -30            // 수정시간 ( n < 30 ) 현재 FILE(0) ~ 30분전 FILE 검색  
$ find . -mmin  +30            // 수정시간 ( n > 30 ) 30분전 FILE  ~ 이전전부 FILE 검색       
$ find . -mmin +30 -mmin -60   // 수정시간 (30 >n , n < 60) 30분전 ~ 60분전 사이만 검색 (AND연산) 

$ find . -atime n/-n/+n        // 액세스 날짜 (파일오픈) 
$ find . -amin n/-n/+n         // 액세스 시간 

$ find . -ctime n/-n/+n        // 파일속성변경 날짜 (파일오픈 및 사용) 
$ find . -cmin n/-n/+n         // 파일속성변경 시간 


2.3 FILE의 크기기준검색
    FILE의 시간과 동일하게 적용하면됨

    $ find ./ -size  +50k
    $ find ./ -size  +50k -printf "%p            %s\n"    // printf format을 만들어 사용 자세한 내용은 man참고 
    $ find ./ -size  +50k | xargs du -hs
    $ find ./ -size  +50k | xargs du -h
    


    2.4 연산의 AND/OR/NOT 검색

    $ find ./ -name 'snd-*.o' -o -name 'snd*.h'   // NAME 연산 NAME 연산  OR연산 적용 
    $ find ./ -name 'snd-soc*.o' -a -name 'snd*.o'   // NAME 연산 NAME 연산 AND 연산적용  
    $ find ./sound/  -name '*.o' -not -name 'built-in.o' //NAME 연산 NAME 연산 NOT 연산적용  ( *.o 검색 하고, -not으로 제외) 
    $ find . -mtime -7  -name '*.c' -o -name '*.h'   // 7일전- 현재    수정한 파일 중 *.c or *.h 검색 
    $ find . -mmin -60 -name '*.c' -o -name '*.h'   // 60분전 - 현재   수정한 파일 중 *.c or *.h 검색
    

    • 수정시간 과 파일이름 검색이용 예제

    $ find . -mtime -7  -name '*.c' -o -name '*.h'   // 7일전- 현재    수정한 파일 중 *.c or *.h 검색 
    $ find . -mmin -60 -name '*.c' -o -name '*.h'   // 60분전 - 현재   수정한 파일 중 *.c or *.h 검색 

    • 수정시간 현재부터 30일 이전까지 관련 내용 검색  ( 30 < n )

    $ find . -mtime -30 -name '*.c' -o -name '*.h' // 검색내용 중  *.c 혹은 *.h 검색 
    $ find . -mtime -30 -name '*.h'                // 검색내용 중  *.h 만 재검색

    • 30이전 부터 60이전까지 관련내용 검색 (  30 > n  &&  60  < n )

    $ find . -mtime +30 -mtime -60  -name '*.c' -o -name '*.h'
    $ find . -mtime +30 -mtime -60  -name '*.h' 


    • find를 이용한 내부 command 이용 

     아래 내용은 날짜별로 관련내용을 분류할때 사용. (mv를 실행)
           - '{}' ';'     find 내부 command

    $ find . -name "*.VER" -mtime -31 -exec mv '{}' /opt/html/31';' -print
    $ find . -name "*.VER" -mtime +31 -mtime -62 -exec mv '{}' /opt/html/62 ';' -print


      http://www.linux-faqs.info/general/difference-between-mtime-ctime-and-atime