it-swarm-ja.com

lsコマンドの結果に対してバッチを実行する

複数のフォルダがあるフォルダがあります。以下のコマンドを使用して、すべてのフォルダーのリストを取得します。

ls -1a -d */ 

次のようなものが返されます。

folder01/
folder02/
folder03/
...

通常、このスクリプトの結果をテキストファイルに保存してから、lsコマンドで返されたフォルダーを処理する2番目のシェルスクリプトファイルを作成し、それを.shファイルに保存してバッチとして実行します。したがって、シェルファイルは次のようになります。

./process_folder.sh sample/folder01/
./process_folder.sh sample/folder02/    
./process_folder.sh sample/folder03/
./process_folder.sh sample/folder04/

ご覧のとおり、lsコマンドの結果に対して./process_folder.shを実行すると、小さな変更があります。各フォルダーの名前の前にsample/を追加しました。

だから問題は、シェルのコマンドを使用してこれらすべてをどのように行うことができるかということです。 (覚えているので、|または>を使用できましたが、詳細を思い出せませんでした)。

1
VSB

lsの出力をプログラムで解析しないでください。

lsの出力は、プログラムではなく、人間が消費するように設計されています。それを直接解析することは、多かれ少なかれ微妙に壊れることができる複数の方法があります。例として、指定したコマンドを実行すると、異なる出力が得られます。

$ mkdir -p newdir/folder0{1,2,3}
$ cd newdir
$ ls -1ad */
folder01//
folder02//
folder03//
$

それらの二重スラッシュが表示されますか?これは、lsls --color=auto -Fにエイリアスしたためです。

その仕事のために設計された、または少なくとも十分に使用できるツールを使用することをお勧めします。 findに目を向けることをお勧めします。

$ mkdir -p newdir/folder0{1,2,3}
$ cd newdir
$ find . -mindepth 1 -maxdepth 1 -type d -printf './process_folder.sh sample/"%P"/\n'
./process_folder.sh sample/"folder03"/
./process_folder.sh sample/"folder01"/
./process_folder.sh sample/"folder02"/
$

-mindepth 1 -maxdepth 1は、検索を指定された開始ディレクトリのみ(この場合は.のみ)に制限し、開始ディレクトリ自体を除外します。 -type dは一致をディレクトリのみに制限します。 -printfは、findが実行できるアクションであり、指定された形式で見つかったディレクトリエントリに関するメタデータを出力します。フォーマット文字列の%Pは、見つかったエントリの名前から開始ディレクトリを引いたものに置き換えられます。詳細については、man 1 findを参照してください。

後で実行するスクリプトを作成する場合は、findの出力をファイルにリダイレクトします。

$ find . -mindepth 1 -maxdepth 1 -type d -printf './process_folder.sh sample/"%P"/\n' > process_folders.sh

コマンドをすぐに実行する単一のコマンドが必要な場合は、代わりにfindの出力をシェルにパイプします。

$ find . -mindepth 1 -maxdepth 1 -type d -printf './process_folder.sh sample/"%P"/\n' | bash

これは壊れることがはるかに少なく、コマンドの出力の凝った書き直しに頼ることなく、あなたが望むものを提供します。現状では、これを破ることができるのは、ディレクトリ名に二重引用符が含まれている場合だけだと思います。

3
a CVn

ループが必要です:

for d in $(ls -1a -d */); do
  ./process_folder.sh "sample/$d"
done
2
Eugen Rieck

次のコマンドを試すことができます。

find . -type d -mindepth 1 -maxdepth 1 -exec bash -c ' /path/to/process_folder.sh "sample/${0##*/}" ' {} \;

これは両方とも質問のディレクトリを見つけ、それらのそれぞれで同時にprocess_folderを実行します:2つではなく1つのコマンド。また、解析の問題の影響を受けません。

2
MariusMatutiae