2016-11-04 49 views
0

我有一個項目,我試圖將所有的文件在Linux系統上收集到一個CSV轉儲到數據庫。獲取「查找」在CSV輸出

我的劇本有

FIND_CMD $TARGET $OPTS -xdev $FS -printf "%h,%f,%y,%s,%TY-%Tm-%Td %TH:%TM:%.2TS\n" 

但問題是,我與他們逗號的文件名%f和目錄名%h

那麼我想我可以把每個項目放在引號中,這不會是一個問題。

$FIND_CMD $TARGET $OPTS -xdev $FS -printf "\"%h\",\"%f\",\"%y\",\"%s\",\"%TY-%Tm-%Td %TH:%TM:%.2TS\"\n" 

但後來我發現,我有引號的文件名在其中:(

,所以我試圖找出如何我可以分「與‘’周圍整個事情的報價。

例子:

「/家」 的 「目錄」, 「文件名」, 「F」, 「1024」, 「2016年11月4日11:11:00」

所以我不知道是否有給我打電話sed作爲-printf一部分,所以我可以告訴find命令來替換方式「s的‘’S

我的另一個想法是,以取代分隔符我發現用類似|的東西命令但如果文件名或目錄名有| |,我可能會遇到同樣的問題在(這是可能的)

是否有任何其他創意解決方案,我可能沒有想到?

+1

寫一個腳本,在其標準輸入上讀取文件名,並根據需要格式化CSV行(它可以使用stat來獲取所有屬性)。然後將'find ... -print'的輸出傳遞給它。 – Barmar

+2

Nul是不允許在文件名中的(這就是爲什麼'find'有'print0'),這樣就可以創建一個好的分隔符... https://en.m.wikipedia.org/wiki/Comparison_of_file_systems –

+0

@MarkSetchell我認爲那會做。那麼我不需要在每個值附近加引號。只要使用NUL字節作爲分隔符,意味着我可以將「」放在哪裏,並且我的CSV閱讀器將能夠處理它。謝謝!我會給你一個! – anoopb

回答

0

考慮在CSV中使用NUL作爲分隔符,因爲這不是Linux文件名/路徑名中的有效字符 - Wikipedia refernce

即也是原因,find命令提供-print0和工具,如的PerlGNU並行具有相應的開關從而產生:

find . -name '*.orig' -print0 | perl -n0e unlink 

find . -print0 | parallel -0 ... 
+0

非常感謝您的建議。 – anoopb