exec 與 xargs的區別
exec 與 xargs的區別
xargs:通過緩衝方式並以前面命令行的輸出作為參數,隨後的命令調用該參數
若忽略 xargs 的 options 來看的話,
cm1 | xargs cm2
可以單純看成: cm2 `cm1`
因此, find .... | xargs rm 也可作 rm `find ...` 來處理.
然而, 若 find 的結果太多, 可能會超過rm 可能接受的最大argument數量而失敗.
xargs優點:由於是批處理的,所以執行效率比較高(通過緩衝方式)
xargs缺點:有可能由於參數數量過多(成千上萬),導致後面的命令執行失敗
若換成 find ....-exec rm {} \; 的話,
因為rm 是"逐個" item 去處理的, 則無此憂慮
例子:(在當前目錄下查找包含hello字元的文件) , 查找包含hello的c文件
1。最傻方法:grep hello * */* */*/*
grep -i "hello" *.c */*.c */*/*.c2。使用exec$ find . -type f -print -exec grep "hello" {} \;
./file/test3
hello
./test1
hello
./test23。使用xargs$ find . -type f -print | xargs grep hello
./file/test3:hello
./test1:hellofind pathname -options [-print -exec -ok]
參數
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' {} \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
find命令選項
-name:按照文件名查找文件。
-perm:按照文件許可權來查找文件。
-prune:使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麼-prune將被find命令忽略。
-user: 按照文件屬主來查找文件。
-group:按照文件所屬的組來查找文件。
-mtime -n +n:按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+n表示文件更改時間距現在n天以前。Find命令還有-atime和-ctime選項,但它們都和-mtime選項。
-nogroup:查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
-nouser:查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
-newer file1 ! file2:查找更改時間比文件file1新但比文件file2舊的文件
-type 查找某一類型的文件
b - 塊設備文件。
d - 目錄。
c - 字元設備文件。
p - 管道文件。
l - 符號鏈接文件。
f - 普通文件
-size n: 查找文件長度為n塊的文件,帶有c時表示文件長度以位元組計。
-depth:在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
-fstype:查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息
-mount:在查找文件時不跨越文件系統mount點。
-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中
find
當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件
find . -name "*" -print
在/etc目錄中查找文件名以host開頭的文件
find /etc -name "host*" -print
exec
find命令將所有匹配到的文件一起傳遞給exec執行
有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤
xargs命令每次只獲取一部分文件而不是全部
匹配當前目錄下的所有普通文件
find . -type f -exec ls -l {} \;
在/ logs目錄中查找更改時間在5日以前的文件並刪除它們
find logs -type f -mtime +5 -exec rm {} \;
在當前目錄中查找所有文件名以.log結尾、更改時間在5日以上的文件,並刪除它們,在刪除之前先給出提示
find . -name "*.log" -mtime +5 -ok rm {} \;
首先匹配所有文件名為「 passwd*」的文件,然後執行grep命令查看這些文件中是否存在一個sam用戶
find /etc -name "passwd*" -exec grep "sam" {} \;
查找當前用戶主目錄下的所有文件
find $HOME -print
find ~ -print
在當前目錄中文件屬主具有讀、寫許可權,並且文件所屬組的用戶和其他用戶具有讀許可權的文件
find . -type f -perm 644 -exec ls -l {} \;
查找系統中所有文件長度為0的普通文件,並列出它們的完整路徑
find / -type f -size 0 -exec ls -l {} \;
查找系統中所有屬於root組的文件
find . -group root -exec ls -l {} \;
查找當前目錄中的所有目錄並排序
find . -type d |sort
xargs
前面的輸出轉換為後方指令的參數輸入
使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。
查找系統中的每一個普通文件,然後使用xargs命令測試它們分別屬於哪類文件
find . -type f -print | xargs file
在整個系統中查找內存信息轉儲文件(core dump) ,然後把結果保存到/tmp/core.log 文件中
find / -name "core" -print | xargs echo "" >/tmp/core.log
在當前目錄下查找所有用戶具有讀、寫和執行許可權的文件,並收回相應的寫許可權
find . -perm -7 -print | xargs chmod o-w
用grep命令在所有的普通文件中搜索hostname這個詞
find . -type f -print | xargs grep "hostname"
統計當前目錄下所有文件的大小,含子目錄,精確到位元組
find ./ -type f | xargs ls -l | awk 'BEGIN{size=0}{size+=$5};END{print size}'
《解決方案》
學習鳥 謝謝分享