2012-07-24 11 views
0

我的目標是遍歷整個文件系統並獲取絕對路徑,文件所有者和文件組,並將它們存儲在一個文件中供以後與腳本一起使用,以重新應用「已知」文件的所有權。如何通過路徑爲所有者/組編制索引並在以後應用它們?

注意:需要安裝'acl'軟件包。

這是我到目前爲止有:./fileog.sh的

find/-exec ./fileog.sh {} \; 

內容:

getfacl -R "$2" | awk 'NR==1, NR==3 {print $3}' | paste -s -d ',' >> ./ogindex.txt 

的問題是,我得到以下錯誤:

getfacl: : No such file or directory 

但如果我只是這樣做,它的工作原理:

find/-exec getfacl -R "$2" {} \; 

自己試用:)

getfacl -R ./some.file | awk 'NR==1, NR==3 {print $3}' | paste -s -d ',' 

我缺少什麼?

+1

不應該''getfacl'調用''fileog.sh'是'getfacl -R'$ 1「'而不是'getfacl -R」$ 2「'?你只是傳遞一個論點...... – twalberg 2012-07-24 16:17:39

回答

0

你不應該同時使用findgetfacl -R,或者你應該更仔細地使用它們。

find已經遞歸,所以你用這種方法多次打擊每個文件。如果您需要領先/剝離,這將是後期處理的一點點

find/-exec stat -c '%n,%U,%G' {} \; >> ./ogindex.txt 

我會解決這個問題這樣。

注意:假設stat支持通過-c格式化;並非所有版本的stat都是相似的。

此外,我強烈建議您不要以此格式存儲此信息。如果文件名有逗號,會發生什麼情況?如果您使用user,group,filename則更安全,因爲您可以將第二個逗號後面的所有內容都視爲文件名。當然,這對製作的文件名仍然很脆弱。

+0

非常感謝你!這是非常清潔,只有一個班輪! – Nobody 2012-07-24 16:47:21

+0

這也有運行*更快*的副作用。在大約一半的運行時間裏,我已經超過了它所處的位置。 – Nobody 2012-07-24 16:51:25

+0

@無人:想要*更快*?如果你不需要任何後處理,用'+'替換'\;'。這會將多個文件傳遞給'stat',從而節省一些開銷。 – Sorpigal 2012-07-24 17:59:41

2

您運行findfileog.sh,給他只有一個參數(文件名,{}):

-exec ./fileog.sh {} \; 

此文件名會在腳本中訪問作爲$1,不$2

您必須在腳本中編寫$1而不是$2,或者您必須在-exec的te腳本中添加缺少的參數。

片段的ogeindex.txt

etc,root,root 
etc/ucf.conf,root,root 
etc/gshadow,root,shadow 
etc/sudoers.d,root,root 
etc/sudoers.d/README,root,root 
etc/motd.tail,root,root 
+0

謝謝你捕捉那個愚蠢的錯誤!現在如果我運行 'find/-exec ./fileog.sh {} \;' 只輸出錯誤。但是,如果我在'find'中指定絕對路徑(或通配符),它將正常工作。 有什麼建議嗎? – Nobody 2012-07-24 16:23:50

+0

是的,它一定是如此; 'find'爲每個找到的文件執行'./ fileog.sh',並且不打印它的名字。無論如何,腳本都會執行。但是,如果你想打印已找到的文件名,只需在'-exec'前加'-print':'-print -exec ... \;' – 2012-07-24 16:28:56

+0

正確,但是./fileog.sh應該打印名稱作爲第一行輸出:'#file:/ boot/initrd.img' – Nobody 2012-07-24 16:33:06

相關問題