2014-10-01 43 views
0

我是相當新的Bash,並且想問這個問題: 是否可能(使用2-liner ;-))到 找到所有subdirs中的所有罐子並顯示其文件夾,名稱和大小?Bash:找到所有subdirs中的所有罐子,並顯示他們的文件夾,名稱和大小

就像這樣:

/jars/ | abc.jar | 123456 
/ext/ | def.jar | 1234 
/ext/ | ghi.jar | 2345 

所以應該做某事。像(僞代碼)

find . -name "*.jar" | while read jar; do echo "$jardir | $jarname | $jarsize"; 

感謝 伯恩哈德

回答

2

如果我理解你的問題,你可以使用find和-exec做到這一點;像,

find . -name "*.jar" -type f -exec du -m {} \; 

其中會發現在.jar結尾的文件,並在每個找到jar文件調用du -m

編輯基於OP評論如下。要單獨得到的一切,你可以使用類似 -

for i in `find . -name "*.jar" -type f`; do 
    echo $(du -m $i|awk '{print $1}') $(dirname $i) $(basename $i) 
done 
+0

謝謝,這幾乎是它。我可以分割一個文件名,如 ext/jars/myjar.jar 到 ext/jars | myjar.jar ? – Bernie 2014-10-01 15:48:37

+0

@Bernie編輯,這樣的事情應該這樣做。 – 2014-10-01 15:56:01

+0

太棒了!而已。 只有一個關於$(dirname $ i)和$(basename $ i)的問題: 我想'dirname'和'basename'是常量,對不對? 他們來自「發現」命令,是這樣嗎? 對不起,這是兩個問題;-) – Bernie 2014-10-01 17:45:37

1

爲了記錄在案,這個問題是不是這麼多的bash本身有關命令行工具,這些工具在提供的bash系統中常常使用。實際上,你可以主要用bash來完成繁重的工作,但是如果你想要兩個(或者實際上是一個)班輪,那麼你應該符合sed程序。例如:

find . -name '*.jar' -exec ls -l {} \; | sed 's,^\([^ ]\+ \+\)\{4\}\([0-9]\+\) \+.* \([^ ]\+/\)\([^ /]\+\)$,\3 | \4 | \2 ,' 

是的,它是令人難以置信的神祕。大部分神祕的部分是一個正則表達式,用於選擇長格式目錄列表中想要的部分。但是你想要簡短,而簡潔卻帶有價格。

1

有使用find唯一的解決辦法:

find -type f -name "*.jar" -printf "| %20h | %10f | %10s |\n" 
+0

我對這個解決方案感到震驚和敬畏。我花了幾次時間閱讀手冊頁中的「查找」,以瞭解你實際上在做什麼。猜猜,需要我全職一年才能深入瞭解'find'命令可以做什麼。 很好的回答! – Bernie 2014-10-01 21:25:04

+0

是的,一個偉大的工具。我已經使用了很多年,還有很多尚未發現的功能。一年只夠學習基本功能。 – 2014-10-01 22:02:09

相關問題