2010-02-19 29 views
63

場景:Linux Shell腳本對於目錄中的每個文件抓取文件名並執行程序

Linux系統中的文件夾。我想遍歷文件夾中的每個.xls文件。

此文件夾通常由各種文件夾,各種文件類型(.sh,.pl,.csv,...)組成。

我想要做的就是循環遍歷中的所有文件,並僅在.xls文件中執行程序。

編輯:

的問題是節目,我必須執行是「xls2csv」從.xls的轉換爲.csv格式。因此,對於每個.xls文件,我必須抓取文件名並將其附加到.csv。

舉例來說,我有一個TEST.XLS文件來回xls2csv的論點是:xls2csv test.xls test.csv

難道我有意義嗎?

回答

156

的bash:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done 
+5

+1簡單 – Tom

+0

簡直太棒了!完美的作品!非常感謝! – ThinkCode

+5

這正是我所尋找的完全不同的原因。一點編輯,對我的特定需求來說是完美的。謝謝= D 對於任何人不明確這是什麼:$ {f%.ext}替換文件名沒有擴展名,所以在這個例子中,它會呈現爲「filename.csv」,而不是「 filename.xls.csv」。 – Frungi

9

看看find命令。

你所尋找的是類似

find . -name "*.xls" -type f -exec program 

帖子編輯

find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv; 

將執行xls2csv file.xls file.xls.csv

接近你想要什麼。

+0

'find -maxdepth 1'排除子文件夾。這也將'test.xls'轉換爲'test.xls.csv'而不是'test.csv'。所以不*相當* OP所要求的,但非常接近。 – ephemient

+0

使用'{}'作爲參數的子字符串而不是整個參數是GNU擴展名,不受POSIX規範中'find'的保證。因此,這個答案不一定可以移植到非GNU平臺。 –

2
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash 

的bash 4(遞歸)

shopt -s globstar 
for xls in /path/**/*.xls 
do 
    xls2csv "$xls" "${xls%.xls}.csv" 
done 
+0

優秀的解決方案。我使用它來允許我編寫haml/scss,並在設計時爲node.js項目構建html/css。 –

+1

如果你不相信你的文件名不包含'$(rm -rf /)'......或者只是空白的東西,那麼這是非常危險的。 –

9
for i in *.xls ; do 
    [[ -f "$i" ]] || continue 
    xls2csv "$i" "${i%.xls}.csv" 
done 

do檢查第一行,如果 「匹配」 文件確實存在,因爲在殼體在您的for中沒有任何匹配項,do將與「* .xls」爲$i。這對你的xls2csv可能會很糟糕。

相關問題