2017-04-12 96 views
-2

所以我正在做一個C程序,模擬shell中的管道命令,但我很困惑它。我知道它在我的目錄中搜索一些東西,對它進行排序並將其廣告給一個file.txt,但我不知道它搜索的是什麼。由shell管道命令迷茫

find . -type f -ls | cut -c 2- | sort -n -k 7 >file.txt ; less <file.txt 

有人能告訴我它是幹什麼的嗎?

+0

'man find'會顯示它搜索...常規文件。 –

+0

搜索常規文件並壓縮前兩個字符(?),然後將其排序並將輸出寫入file.txt。也許你的find版本不能像我一樣工作(解釋cut命令)。 –

回答

1
find . -type f -ls | cut -c 2- | sort -n -k 7 >file.txt ; less <file.txt 

這是一個非常奇怪的命令。你確定你已經正確複製了嗎?它從哪裏來的?

我建議打破命令,通過less管道部分版本的輸出,所以你可以看到發生了什麼。 (當然,你應該閱讀所有相關手冊頁,如果你還沒有。)

find . | less 
find . -type f | less 
find . -type f -ls | less 
find . -type f -ls | cut -c 2- | less 
... 

或者使用head而不是less,所以你可以看到輸出的前幾行。

find . -type f遞歸查找當前目錄下的所有普通文件('.')。 -ls選項告訴它爲每個文件顯示一行,其格式與ls -l生成的格式類似。

find ... -ls的輸出以數字inode編號開始。這個數字可能會用前導空格打印。

cut -c 2-刪除less輸出各行的前兩個字符。我不知道你爲什麼想這樣做。我懷疑這個想法是爲了確保在行首處沒有空格,但這不是一個可靠的方法。如果inode數量恰好足夠小,則可能有三個或更多前導空格。這可能會更好,因爲sed 's/^ *//' - 但它甚至沒有必要。

sort -n -k 7在第7個空格分隔的字段上進行數字排序,這恰好是文件的字節大小。所以這是按照文件大小從最小到最大排列列表。我猜,以前的cut命令旨在確保即使原始行以空格開始,大小仍是第7個字段,但這不是必需的(除非可能對sort版本的行爲有點不同)。

輸出寫入file.txt,然後使用less <file.txt查看。 <很愚蠢; less完全能夠從其命令行上命名的文件讀取,因此less file.txt可以工作。顯然,用戶想要保存輸出;否則將sort的輸出輸出到less會更有意義。 tee命令在這裏也可能有用:find ... | tee file.txt | less

find ... -ls的輸出,如ls -l的輸出,意味着是人類可讀的;它的而不是用於自動文本處理。從一個實現到另一個實現可能會有所不同。有辦法產生更多的經常產出。如果您有GNU find,則它有一個-printf選項,可讓您指定,確切地說它打印的信息以及順序。

+0

我從老師給我的練習中複製而來。哇,非常感謝你的這個信息。這將有助於很多 – Ackerman

0
  1. 人發現

  2. 人砍

  3. 人排序

  4. 人少

1

find . -type f搜索在當前目錄中的常規文件(.意味着當前迪rectory)或任何子目錄,並且-ls只是以與ls相同的格式打印結果。 cut -c 2-find的輸出中刪除2個第一個字符,然後對其進行數字排序並輸入到一個文件中,然後使用less讀取該文件。

+0

非常感謝! – Ackerman