2016-12-15 28 views
-1

for i in *.txt; do xxd -l 3 $i >> log done如何在bash

登錄可變我也希望記錄每個結果的文件名$i。例如: -

file_name result_of_command

+1

我不知道我明白你在問什麼。你的意思是你只是想做到這一點:echo「$ i」>> log?請更清楚你在找什麼。 –

+0

@ jeremy-gurr,是的,我想要$ i,然後是結果。 –

回答

0

我不完全清楚你所問的,但是這是你想要的嗎?

for i in *.txt; 
do 
    echo "$i" >> log 
    xxd -l 3 $i >> log 
done 
+0

謝謝,我試圖把'echo'放在一個錯誤的地方。 –

1

你可能只需要使用printf

for f in *.txt; do 
    printf "%s: %s\n" "$f" "$(xxd -l 3 "$f")" 
done >> log 
+0

謝謝,它也適用。 –

0

這是更好地使用find-exec選項符合特定條件的每個文件運行一個命令。

如果您希望當前目錄中的所有文件匹配*.txt,則可以使用find。您可以使用-exec選項爲每個文件運行命令。 {}替換文件的名稱和\;(轉義的;終止命令)。您可以使用+來告訴find用多個文件名替換{}

find . -type f -name '*.txt' -maxdepth 1 -exec xxd -l 3 {} \; >> log 

請注意,上面的示例包含隱藏文件,您可以使用正則表達式排除它們。

find . -type f \(! -regex '.*/\..*' \) -name '*.txt' -maxdepth 1 -exec xxd -l 3 {} \; >> log 

另外,如果你打算在當前目錄中的文件名替換文件,並在命令中使用它們,總是用./*。以-開頭的路徑可能會被您的命令解釋爲選項。

+1

我不認爲for循環遭受這些缺陷之一。根據[this](http://www.in-ulm.de/~mascheck/various/argmax/),它實際上可以解決太多參數列表的命令;和空格的文件名被處理得很好。 –

+0

@benjaminw我認爲你是對的。在for循環中,在IFS中的任何字符上使用文字全局模式還是循環變量總是匹配glob可能擴展到的一個完整路徑? –

+1

它匹配完整的路徑,我會說。 –