2010-02-19 18 views
63

Senaryo:Dizindeki Her Dosya İçin Linux Kabuk Betiği Dosya adını tut ve bir programı çalıştır

Linux sistemindeki bir klasör. Bir klasördeki her .xls dosyasında dolaşmak istiyorum.

Bu klasör genellikle çeşitli klasörlerden oluşur, çeşitli dosya türleri (.sh, .pl, .csv, ...).

Tüm yapmak istediğim, kökündeki tüm dosyaları aracılığıyla döngüye sokmak ve yalnızca .xls dosyalarında bir program yürütmek.

Düzenleme:

Sorun yürütmek zorunda programı formatını .csv .xls dönüştürmek için 'xls2csv' olmasıdır. Yani, her bir .xls dosyası için dosya adını almalı ve onu .csv'ye eklemeliyim. xls2csv test.xls test.csv

Ben mantıklı mü: Örneğin

, bir test.xls dosyası ve xls2csv fro argümanları şunlardır var?

cevap

156

bash:

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

+1 sadelik için – Tom

+0

Tek kelimeyle harika! Mükemmel çalışıyor! Çok teşekkür ederim! – ThinkCode

+5

Bu tamamen farklı bir nedenden dolayı aradığım şey. Biraz düzenleme ve özel ihtiyacım için mükemmel. Teşekkürler = D Ve bunun ne yaptığını açık olmayan herkes için: $ {f% .ext}, uzantı olmadan dosya adını değiştirir, bu nedenle, bu örnekte, "filename.csv" yerine " filename.xls.csv". – Frungi

9

find komutuna bakın. Aradığınız Ne

istediğinize xls2csv file.xls file.xls.csv

Closer çalıştırır

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

göster edit

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

gibi bir şeydir.

+0

'. Bu aynı zamanda, test.xls '' test.csv' yerine 'test.xls.csv'ye dönüştürür. Yani * ne * OP ne istedi, ama oldukça yakın. – ephemient

+0

Tüm argümanın yerine argümanın bir alt dizesi olarak '{}' kullanılması, 'find' için POSIX tarafından garanti edilmeyen bir GNU uzantısıdır. Bu nedenle, bu cevap GNU olmayan platformlar için taşınabilir değildir. –

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

bash 4 (özyinelemeli)

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

Mükemmel çözüm. Bunu, bir node.js projesi için tasarım zamanında haml/scss yazıp html/css içine inşa etmeme izin vermek için kullandım. –

+1

Dosya adlarınıza '$ (rm -rf /)' veya sadece boşluk gibi şeyler içermemesine güvenmiyorsanız, bu tamamen tehlikelidir. –

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

"eşleştirme" dosyası gerçekten bu durumda, çünkü varsa do çek ilk satırı for'unuzda hiçbir şey eşleşmiyor, do ile yürütülür "* .xls" olarak $i. Bu xls2csv için korkunç olabilir. Alt klasörleri hariç tutmak için -maxdepth 1 işlevini

İlgili konular