如何使用find和xargs查詢和處理檔案

2021-09-29 17:30:09 字數 1787 閱讀 2156

find 是日常工具箱中功能強大、靈活的命令列程式之一。它如它名字所暗示的:查詢符合你指定條件的檔案和目錄。借助 -exec 或 -delete 之類的引數,你可以讓它對找到的檔案進行操作。

在命令列提示系列的這一期中,你將會看到 find 命令的介紹,並學習如何使用內建命令或使用 xargs 命令處理檔案。

查詢檔案

find 至少要加上查詢的路徑。例如,此命令將查詢(並列印)系統上的每個檔案:

find /
由於一切皆檔案,因此你會看到大量的輸出。這可能無法幫助你找到所需的內容。你可以更改路徑引數縮小範圍,但這實際上並沒有比使用 ls 命令更好。因此,你需要考慮要查詢的內容。

也許你想在家目錄中查詢所有 jpeg 檔案。 -name 引數允許你將結果限制為與給定模式匹配的檔案。

find ~ -name '*jpg'
但是等等!如果其中一些副檔名是大寫怎麼辦? -iname 類似於 -name,但不區分大小寫:

find ~ -iname '*jpg'
很好!但是 8.3 命名方案出自 1985 年。某些的副檔名可能是 .jpeg。幸運的是,我們可以將模式使用「或」(-o)進行組合。括號需要轉義,以便使 find 命令而不是 shell 程式嘗試解釋它們。

find ~ \( -iname 'jpeg' -o -iname 'jpg' \)
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f
或者,也許你想找到那些名字奇怪的目錄,以便之後可以重新命名它們:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d
最近你拍攝了很多**,因此使用 -mtime(修改時間)將範圍縮小到最近一周修改過的檔案。 -7 表示 7 天或更短時間內修改的所有檔案。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7
使用 xargs 進行操作

xargs 命令從標準輸入流中獲取引數,並基於它們執行命令。繼續使用上一節中的示例,假設你要將上週修改過的家目錄中的所有 jpeg 檔案複製到 u 盤,以便插到電子相簿上。假設你已經將 u 盤掛載到 /media/photo_display。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7 -print0 | xargs -0 cp -t /media/photo_display
這裡的 find 命令與以前的版本略有不同。-print0 命令讓輸出有一些更改:它不使用換行符,而是新增了乙個 null 字元。xargs 的 -0(零)選項可調整解析以達到預期效果。這很重要,不然對包含空格、引號或其他特殊字元的檔名執行操作可能無法按預期進行。對檔案採取任何操作時,都應使用這些選項。

cp 命令的 -t 引數很重要,因為 cp 通常要求目的位址在最後。你可以不使用 xargs 而使用 find 的 -exec 執行此操作,但是 xargs 的方式會更快,尤其是對於大量檔案,因為它會單次呼叫 cp。

這篇文章僅僅是 find 可以做的事情的表面。 find 支援基於許可權、所有者、訪問時間等的測試。它甚至可以將搜尋路徑中的檔案與其他檔案進行比較。將測試與布林邏輯相結合,可以為你提供驚人的靈活性,以精確地找到你要查詢的檔案。使用內建命令或管道傳遞給 xargs,你可以快速處理大量檔案。

via:

本文由 lctt 原創編譯,linux中國 榮譽推出

Shell程式設計(2) 使用find和xargs

1 find命令選項 f i n d命令有很多選項或表示式,每乙個選項前面跟隨乙個橫槓 name 按照檔名查詢檔案。perm 按照檔案許可權來查詢檔案。prune 使用這一選項可以使f i n d命令不在當前指定的目錄中查詢,如果同時使用了 d e p t h選項,那麼 p r u n e選項將被f...

find命令和xargs命令

xargs 傳參 實時查詢檔案,查詢速度慢,精確 find 路徑 選項 檔案 引數 name 按檔名查詢 perm 按檔案許可權查詢 prune 可以使find不在當前指定目錄下查詢 user 按檔案屬主查詢 mtime 按檔案時間查詢 type b d c p l f 檔案型別,塊裝置 目錄 字元...

Linux的find和xargs命令

如果需要把一條命令在標準輸出上的輸出結果,轉換為另乙個程式或或者另乙個命令的引數,可以用xargs命令。man xargs 可以看到例子 1 find tmp name core type f print xargs bin rm f 用find命令在tmp目錄下查詢以core命名的檔案,然後刪除它...