ディレクトリ内の各ファイルのLinuxシェルスクリプトファイル名を取得してプログラムを実行します


84

シナリオ:

Linuxシステムのフォルダー。フォルダ内のすべての.xlsファイルをループしたいと思います。

このフォルダーは通常、さまざまなフォルダー、さまざまなファイルタイプ(.sh、.pl、.csv、...)で構成されます。

私がやりたいのは、ルート内のすべてのファイルをループして、.xlsファイルでのみプログラムを実行することです。

編集:

問題は、実行する必要のあるプログラムが.xlsから.csv形式に変換するための「xls2csv」であるということです。したがって、.xlsファイルごとに、ファイル名を取得して.csvに追加する必要があります。

たとえば、test.xlsファイルがあり、xls2csvの引数は次のとおりです。 xls2csv test.xls test.csv

私は理にかなっていますか?

回答:


199

bash:

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

単に素晴らしいです!完璧に動作します!どうもありがとうございます!
ThinkCode 2010

6
これはまったく別の理由で私が探していたものです。少し編集すれば、私の特定のニーズにぴったりです。ありがとう= Dそして、これが何をするのかはっきりしない人のために:$ {f%.ext}は拡張子なしでファイル名を置き換えるので、この例では、「filename」ではなく「filename.csv」にレンダリングされます。 xls.csv」。
frungi 2012

「linuxforeachtxt file」をグーグルで検索して、これを見つけました。これは私が実際に使用xls2csvにしようとしていた、必要なものを正確だったが、私はすべての結果がその:)を探して見つけられないと考えました
がakiller

1
* .xlsがどのファイルとも一致しない場合、$ fの値は* .xlsになります。それが問題であるかどうか私の答えを確認してください。
AndrewBourgeois 2017年

またはnullglob、ループをスキップするために設定することもできます。
Ignacio Vazquez-Abrams

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

の最初の行は、do「一致する」ファイルが実際に存在するかどうかをチェックしますfor。これdoは、に一致するものがない場合、は「* .xls」をとして実行されるため$iです。これはあなたにとって恐ろしいかもしれませんxls2csv


13

findコマンドを見てください。

あなたが探しているのは次のようなものです

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

投稿編集

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

実行されます xls2csv file.xls file.xls.csv

あなたが望むものに近い。


find -maxdepth 1サブフォルダーを除外します。これもの代わりにに変換さtest.xlstest.xls.csvますtest.csv。そうではない、非常にどのようなOPがかなり近いを求めたが、。
ephemient 2010

{}引数全体ではなく引数の部分文字列として使用するのはGNU拡張であり、のPOSIX仕様では保証されていませんfind。そのため、この回答は必ずしも非GNUプラットフォームに移植できるとは限りません。
チャールズ・ダフィー

4
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

優れたソリューション。これを使用して、node.jsプロジェクトの設計時にhaml / scssを記述し、html / cssに組み込むことができます。
クリス・ケンプ

1
ファイル名に$(rm -rf /)...や空白などが含まれていないと信頼できない場合、これは非常に危険です。
チャールズ・ダフィー2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.