http://zhumeng8337797.blog.163.com/blog/static/1007689142011012516171/
-exec: find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为' command' {} \;,注意{ }和\;之间的空格。
-ok: 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
使用exec或ok来执行shell命令
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的
(在有些操作系统中只允许- e x e c选项执行诸如l s或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行r m命令删除文件之前,最好先用l s命令看一下,确认它们是所要删除的文件。
e x e c选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
为了使用e x e c选项,必须要同时使用p r i n t选项。如果验证一下f i n d命令,会发现该命令只输出从当前路径起的相对路径及文件名。
例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c选项中
为此要实现上面文件备份的需要,只需要使用命令
find /home/oracle –mtime 1 –exec cp {} /backup/{}.backup \;即可。
一、find 命令格式
find pathname -options [-print -exec -ok ...]
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
-name
按照文件名查找文件。
-perm
按照文件权限来查找文件。
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变文件状态的文件
-ctime n
查找系统中最后n*24小时被改变文件状态的文件
-mmin n
查找系统中最后N分钟被改变文件数据的文件
-mtime n
查找系统中最后n*24小时被改变文件数据的文件
# find . -type f -exec ls -l { } \;
-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
$ find logs -type f -mtime +5 -exec rm { } \;
$ find . -name "*.conf" -mtime +5 -ok rm { } \;
< rm ... ./conf/httpd.conf > ? n
# find /etc -name "passwd*" -exec grep "sam" { } \;
sam:x:501:501::/usr/sam:/bin/bash
$ find $HOME -print
$ find ~ -print
$ find . -type f -perm 644 -exec ls -l { } \;
$ find / -type f -size 0 -exec ls -l { } \;
$ find /var/logs -type f -mtime +7 -ok rm { } \;
$find . -group root -exec ls -l { } \;
-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
rm { } \;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n
$ find . -type d | sort
$ find /dev/rmt -print
#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory: ISO-8859 text\
......
$ find / -name "core" -print | xargs echo "" >/tmp/core.log
#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6
# ls -l
drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf
# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
# find . -type f -print | xargs grep "hostname"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
$ find ~ -name "*.txt" -print
$ find . -name "*.txt" -print
$ find . -name "[A-Z]*" -print
$ find /etc -name "host*" -print
$ find ~ -name "*" -print 或find . -print
$ find / -name "*" -print
$find . -name "[a-z][a-z][0--9][0--9].txt" -print
$ find . -perm 755 -print
# ls -l
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp
$ find /apps -path "/apps/bin" -prune -o -print
find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [-path ..] [expression] 在路径列表的后面的是表达式
if -path "/usr/sam" then
-prune
else
-print
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print
$ find ~ -user sam -print
$ find /etc -user uucp -print
$ find /home -nouser -print
$ find /apps -group gem -print
$ find / -nogroup-print
$ find / -mtime -5 -print
$ find /var/adm -mtime +3 -print
newest_file_name ! oldest_file_name
-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
# find -newer httpd1.conf ! -newer temp -ls
1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf
1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp
1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel
$ find . -newer temp -print
$ find /etc -type d -print
$ find . ! -type d -print
$ find /etc -type l -print
$ find . -size +1000000c -print
$ find /home/apache -size 100c -print
$ find . -size +10 -print
$ find / -name "CON.FILE" -depth -print
$ find . -name "*.XC" -mount -print
find规定了源代码目录,并对文件名文件类型进行了限定。
由于我的代码是在svn管理下的,后面的grep需要将.svn目录过滤掉。
然后里面还用了一些开源项目log4cplus、zlib、gtest,也过滤掉。总之grep进行更加灵活的过滤。
接下来的xargs作用是把分行的输出用空格拼接起来,将结果传递给wc做输入。
wc -l便是统计文件的行数了。
例如
find ./src -type f| grep -v .svn | grep -v log4cplus-1.0.3-rc3 |grep -v zlib-1.2.3 |grep -v gtest |xargs wc -l
find . -name "*.cc" -or -name "*.h" -or -name "*.sh" | grep -v .svn|xargs wc -l
find .| grep -v CVS| xargs wc -l
find . -name "*" | xargs -i cp {} /home/users/
-i 表示 find 传递给xargs的结果 由{}来代替
-I 必须指定替换字符 -i 是否指定替换字符-可选
举例:
find . | xargs -I {} cp {} $D_PATH
与
find . | xargs -i cp {} $D_PATH
两者效果相同
在unix或linux环境中经常会用到find -mtime这样的写法来找某某时间点之前的文件,至于如何写find -mtime +N/-N/N,原来并不是很清楚,今天找了些资料看看,画下了这个图,以便理解和记忆:
从图上可以看出,以当前时间点开始算起,+表示往左,从该时间点开始再继续往更早推,可以称作xx以外;-表示往右,从该时间点算起往后的时间推,可以称作xx以内;没有加减号表示据此此前第N天。因此:
我们来看下面这个例子:
我当前的时间2011年3月1日22:31,我有如下的文件:
-mtime +2,表示2天以外的,即从距离当前时间(2011-03-01 22:31)的2天前开始算起,往更早的时间推移。因此,距离当前时间的2天为:2011-02-27 22:31,在此前的文件,会被选出来。
-mtime +1,表示1天以外的,即从距当前时间的1天前算起,往更早的时间推移。因此2011-02-28 22:31前的文件属于该结果,2011-02-28 22:31后的文件不属于该结果:
-mtime 2, 距离当前时间第2天的文件,当前时间为2011-03-01 22:31,往前推2天为2011-02-27 22:31,因此以此为时间点,24小时之内的时间为2011-02-27 22:31~2011-02-28 22:31,因此这段时间内的文件会被选中出来:
-mtime 1, 距离当前时间第1天的文件,当前时间为2011-03-01 22:31,往前推1天为2011-02-28 22:31,因此以此为时间点,24小时之内的时间为2011-02-28 22:31~2011-03-01 22:31,因此这段时间内的文件会被选中出来:
-mtime -1 表示1天以内的,从距当前时间的1天为2011-02-28 22:31,往右推移:
-mtime -2 表示2天以内的,从距当前时间的2天为2011-02-27 22:31开始,往右推移:
在 Linux 平台下找檔案不外乎使用威力強大的 find 命令,威力強大的背後就是有一點點學習曲線,不過整體上來說還算簡單,因此想寫一篇文章留下備忘,讓自己日後可以快速查閱參考。
【 基本語法 】
查詢檔案名稱 ( 也可以查詢「目錄名稱」,其中 * 是萬用字元 )
find $HOME -name '*.mp3'
註1: $HOME 是 Linux 下的一個環境變數,預設指向執行帳號的 HOME 目錄
查詢檔案名稱 (不區分大小寫)
find /etc -iname 'Network'
指定只要搜尋「檔案」名稱
find /var/log -iname '*.log' -type f
指定只要搜尋「目錄」名稱
find /etc -iname 'apache2' -type d
補充說明:可用的 –type 參數值如下
b block (buffered) special
c character (unbuffered) special
d directory ( 一般目錄 )
p named pipe (FIFO)
f regular file ( 一般檔案 )
l symbolic link
s socket
D door (Solaris)
找尋所有檔案大小大於 50MB 的檔案
find /var -type f -size +50M
註1: 不加上 –name 參數即代表搜尋所有檔案
找尋所有檔案大小小於 50MB 的檔案
find /var -type f -size -50M
尋找超過 7 天沒有被存取或修改過的檔案 (判斷檔案存取時間)
find $HOME -type f -atime +7
尋找曾經在 7 天內被存取或修改過的檔案 (判斷檔案存取時間)
find $HOME -type f -atime -7
尋找超過 10 分鐘沒有被存取或修改過的檔案 (判斷檔案存取時間)
find $HOME -type f -amin +10
尋找曾經在 10 分鐘內被存取或修改過的檔案 (判斷檔案存取時間)
find $HOME -type f -amin -10
尋找檔案建立時間已超過 30 天的檔案
find $HOME -type f -ctime +30
尋找特定使用者的檔案 ( 以帳號名稱 tom 為例 )
find $HOME -type f -user tom
【 進階應用 】
刪除 30 天以上未經存取過的暫存檔案 ( 注意: 以下指令最後一個分號(;)前一定要加上反斜線 )
find /tmp -type f -atime +30 -print -exec rm -f '{}' \;
註1: 加上 –print 是為了讓被刪除的檔案檔名一併顯示在畫面上,這個參數可以省略
註2: 使用 –exec 會讓查詢到的每一個檔案路徑代入 ‘{}’ 位置,一個檔案會執行一遍 rm 命令
刪除 30 天以上未經存取過的暫存檔案 ( 使用 xargs 當成單一命令的參數 )
find /tmp -type f -print0 | xargs -0 rm -v
註1: 加上 –print0 是為了讓輸出的結果不以「斷行字元」分隔,而改以 null 為結果的分隔字元
註2: 使用 xargs 命令加上 –0 是為了讓傳入的資料以 null 字元當成參數的分隔
註3: 使用 rm 命令加上 –v 是為了能顯示出被刪除的檔案名稱,這個參數可以省略
註4: 使用 xargs 會將所有 find 命令查到的檔案轉換成 rm 的參數列,如果檔案過多可能會執行失敗!
註5: 使用 xargs 可確保後面的程式 ( rm ) 只執行一次,所以理論上執行速度較快!
相同參數需輸入多筆並且以「或」邏輯運算時要用 –o 參數串接起來
例1:同時找兩種檔名樣式的檔案
find $HOME -name '*.mp3' -o -user '*.ogg'
例2:同時找兩個擁有者的檔案
find /usr/local -user user1 -o -user user2
【 注意事項 】
[user1@server ~]# find $HOME -name *.txt
find: paths must precede expression
Usage: find [path...] [expression]