2017-04-06 56 views
2

我從來沒有能夠完全理解find命令的-prune動作。但實際上,至少我的一些誤解源於省略'-print'表達的效果。使用'-prune'時,將'-print'從'find'命令中省略掉

從「查找」手冊頁..

「如果表達式包含比其他-prune沒有行動,是在該表達式爲true的所有文件進行-print。」

..我一直以來(多年)都意味着我可以忽略'-print'。

但是,如以下示例所示,至少在出現'-prune'表達式時使用'-print'和省略'-print'之間的區別。

首先,我有我的工作目錄下的以下8個目錄..

aqua/ 
aqua/blue/ 
blue/ 
blue/orange/ 
blue/red/ 
cyan/blue/ 
green/ 
green/yellow/ 

總共有10個文件中的8個目錄..

aqua/blue/config.txt 
aqua/config.txt 
blue/config.txt 
blue/orange/config.txt 
blue/red/config.txt 
cyan/blue/config.txt 
green/config.txt 
green/test.log 
green/yellow/config.txt 
green/yellow/test.log 

我的目標是使用'查找'來顯示文件路徑中沒有'藍色'的所有常規文件。有五個文件符合這個要求。

可正常工作..

% find . -path '*blue*' -prune -o -type f -print 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./aqua/config.txt 

但當我離開了「-print」它不僅返回五個所需的文件,而且其路徑名稱中包含「藍色」的任何目錄..

% find . -path '*blue*' -prune -o -type f 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./cyan/blue 
./blue 
./aqua/blue 
./aqua/config.txt 

那麼爲什麼顯示三個「藍色」目錄?

這可能很重要,因爲我經常試圖刪除包含超過50,000個文件的目錄結構。當處理該路徑時,我的find命令,特別是如果我爲每個文件執行'-exec grep',可能需要大量的時間來處理我完全不感興趣的文件。我需要有信心,發現不會進入修剪結構。

回答

0

隱含的-print適用於整個表達式,而不僅僅是它的最後部分。

% find . \(-path '*blue*' -prune -o -type f \) -print 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./cyan/blue 
./blue 
./aqua/blue 
./aqua/config.txt 

它並沒有進入修剪過的目錄,而是打印出最高層。

輕微修飾:

$ find . ! \(-path '*blue*' -prune \) -type f 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./aqua/config.txt 

(具有隱含-a)將導致具有與不-print相同的行爲。