หาเป้าหมายและทำ command อื่นต่อ

บางครั้งต้องการหาไฟล์หรือ ไดเรคทอรี ซึ่งไม่รู้อยู่ ณ จุดไหน ถ้าเจอแล้วต้องทำอะไรต่อ

เราสามารถทำได้โดยใช้คำสั่ง Find

การค้นหา directory หรือ ชื่อไฟล์ใน directory ที่ต้องการค้น
Linux command “.” หมายถึง current directory ในการกรณีไม่ใส่ path ในการค้นหา

find [pathnames] [conditions] 
 
find . -name "[file name or directory name]"
ตัวอย่าง
find  /home/data/  -name "*.log" 
find . -name "*data*.*"

ค้นหาคำ

ค้นหาในคำ <div id="newuser"> ทุกไฟล์ใน  /export/web/code/
find  /export/web/code/ -exec grep -l "<div id=\"newuser\">"  {} \;
 
ค้นหาคำ "postcode" ในทุกๆ ไฟล์ในไดเรคทอรีปัจจุบัน
find . -exec grep -l "postcode" {} \;  
 
ค้นหาคำ "postcode" ในทุกๆ ไฟล์ในไดเรคทอรีนั้น
find /home/username/HEAD/production/cust/templates  -exec grep -l "postcode" {} \;

หาและแทนที่

ใช้ Find หาไฟล์ และใช้คำสั่ง sed ในการหาคำและ replace
syntax
find [directory] -name [specify name] -exec sed -i "s/[find string]/[replace with]/g" {} \;
เช่น
find . -name "data.txt" -exec sed -i "s/cat/dog/g" {} \;
หาไฟล์ data.txt ในไดเรคทอรีปัจจุบัน และ replace cat ด้วย dog

หาและลบ

บางครั้งเราต้องการลบไฟล์ที่ไม่จำเป็นออก เช่น log เก่าๆ ของงานต่างๆ
หลักการคือ หาไฟล์ หรือหาไดเรคทอรี แล้วถ้าเจอก็ลบซะ
เราต้องรู้การใช้คำสั่ง 2 คำสั่ง คือ find และ rm แต่จะให้ทำงานพร้อมไปกับหาเจอเลย โดยที่เราไม่ต้องตามไปลบออกที่หลัง
 
find . -name *_11*.log -exec rm {} \;
หาไฟล์อะไรก็ได้ที่มี _11 และนามสกุล log ถ้าหาเจอแล้วลบ
 
find . -type d -exec rm -r {} \;
หาไดเรคทอรี แล้วลบ
 
find . -type f -mtime +0 -exec rm {} \;
หาไฟล์ที่มีการเปลี่ยนแปลง เจอแล้วลบ

Find and Sort by last modified

It's useful when we would like to check the latest update. Go to directory you would like to check, the run command follow instruction below:  
find . -type f -mtime -[day] -ls | sort -k8,9r
// syntax find = look at present date to previous date [day] and sort with column 8 and 9
 
find . -type f -mtime -1 -ls | sort -k8,9r
// check yesterday to today and sort by month and day
 
find . -type f -mtime -3 -exec ls --full-time  {} \; | sort -k6,7

Find and Get the size of all directories in the current directory

find . -maxdepth 1 -type d -print | xargs du -sk | sort -rn
// maxdepth 1 = only category under current directory
// -type d = only directory
// xargs = pass list of directory to du command

Find, then copy to one directory

find [path-looking] -name "[keyword]" -exec cp [--parents] -r {} [destination]\;
 path-looking: directory or folder that we would like to look for (e.g. production/generic/wireframe/USdummycontent)
 keyword: wording to specific to find (e.g. data.rec, ae, wz*.*)
  --parents: append source path to DIRECTORY
  -r: copy directories recursively
  destination: directory or folder you would like to copy to
 
 Example:
find production/generic/site/language/  -name "fr" -exec cp --parents -r {} only_th/ \;
 (copy all fr folders to only_th folder)

Find, then copy to the same directory

find [path] -name "[keyword]" | awk '{print "cp -r "$1" "$1";"}' | sed "s/[keyword]\;/[newkeyword]/g" | sh
 
Ex:find . -name "en" | awk '{print "cp -r "$1" "$1";"}' | sed "s/en\;/ae/g" | sh

Comments are closed.