2016-08-03 33 views
2

在bash,我可以找到的文件的基本名稱(名稱不帶路徑)是這樣的:查找文件恢復基本名稱和大小

find . -exec basename {} \; 

,我可以得到文件的大小是這樣的:

find . -exec ls -l {} \; | awk '{print $5}' 

但我需要獲取由空格分隔的基本名稱和文件大小。

如何將這兩個命令正確地結合使用一個查找操作? 此代碼不起作用:

find . -exec basename {} \; -exec ls -l {} | awk '{print $5}' \; 

awk: can't open file ;find: 
source line number 1 
-exec: no terminating ";" or "+" 

我想創建一個快速的重複文件查找。使用這個列表,我會做一個排序,然後使用uniq找到使用條件重複的所有文件:重複=相同的「基本名稱」&相同的「大小」(沒有md5檢查)。

到目前爲止,製作這個初始列表是我在句法上(也許是編程)掛起的地方。如果你有更好的方法,請告訴我。它試圖使用最基本的bash命令使其工作,因此它可以在linux和mac上運行而無需安裝任何東西。

回答

3

GNU系統

對於GNU系統,使用此命令

find . -printf '%k\t%f\n' 

,讓您的每個文件和基本名稱的大小的輸出。

  • %k打印文件的大小以kb
  • \t字面製表符
  • %f打印的文件名與領先的目錄路徑移除
  • \n字面換行符

OSX

對於OSX,使用th是命令,因爲它本身不直接支持-printf參數。

find . -exec bash -c 'printf "%s\t%s\n" $(stat -f " %z" "$1") "$(basename "$1")"' - {} \; 
+0

感謝您的迴應,但是OSX不使用GNU工具,所以它不適用於這個跨平臺腳本。 find命令僅限於FreeBSD使用的find版本中可用的命令。更多信息在這裏:http://stackoverflow.com/questions/752818/find-lacks-the-option-printf-now-what – Kevvvin

+1

無瑕!優秀的編碼!完善! – Kevvvin

+1

要回答你關於osx版本的問題,我必須將它作爲一個實用程序部署到創建相機鏡頭驅動器的人員,他們都在各種版本的OSX上工作,所以它必須相當獨立於此。這個想法是,如果不安裝其他任何東西,他們可以在驅動器的根目錄下運行一個小型bash程序,該程序可以快速解析驅動器上的所有文件,並告訴它們是否存在任何文件名大小的錯誤。如果有這些類型的蠢事,他們搞砸創造的鏡頭驅動器(每個攝像頭的主人應該是唯一的)。 – Kevvvin