
私のparent_directoryにはE-11_GとE-10_Gというサブディレクトリがあります。各サブディレクトリには、E-2_U、E-1_U、およびE0_Uという名前のサブディレクトリがあります。各フォルダで、ander、ander.band、ander.data、ander.in、およびander.logファイルに対してコマンドを実行します。
より良い写真は次のとおりです。
parent_directory
↓
E-11_G/ E-10_G/
↓
E-2_U/ E-1_U/ E0_U/
↓
ander ander.band ander.data ander.in ander.log
より効率的なバージョンを作成したいと思います。
#!/bin/bash
cd parent_directory/E-11_G/E-2_U/;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E-1_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E0_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../../E-10_G/E-2_U/;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E-1_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E0_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
私はこのスクリプトをそのまま正常に実行できましたが、実際には私が提供したものよりも多くのディレクトリを使用しているので、より簡単で効率的な作成方法が必要です。私がこれを行う理由は、各サブディレクトリごとに各 "ander"ファイルの特定の履歴を維持する必要があるためです。デフォルトでは、このスクリプトを実行し、シェル>テキストをテキストファイルにエクスポートを使用して、ターミナルウィンドウに表示されているすべてをテキストファイルにエクスポートする予定です。そのため、各ディレクトリのレコードを番号順に並べ替えたいと思います。
どうすればスクリプトを効率的に作成できますか?これが私の目標です。
#!/bin/bash
cd parent_directory/;
do i= -11, -10
do j= -2, 0
cd E-i_G/E-j_U/;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
end
end
私はこれがFortranでほとんど書かれていることを知っていますが、bashスクリプトにこれと同等または類似のものがありますか?私は「forループ」を使用しようとしましたが、最初のスクリプトと同じ結果を提供する方法で書くことはできないようです。
答え1
cd parent_directory/
for i in {-11..-10}
do
for j in -2 0
do
(
cd "E${i}_G/E${j}_U/"
ls -l ander ander.band ander.data
cat ander.in
cat ander.log
pwd
)
done
done
メモ:
中カッコ表記を使用して数値範囲を繰り返すことができます。
for i in {-11..-10}
明示的な項目のリストを繰り返すこともできます。
for j in -2 0
いくつかの場所が変数に依存するようにディレクトリを変更できます。
cd "E${i}_G/E${j}_U/"
このコマンドの引数は、
cd
現在のディレクトリに基づいてディレクトリを指定します。そのディレクトリで作業を終えたら、もう一度parent_directoryに変更しようとしています。これにはいくつかの方法がありますが、簡単な方法は、cd
コマンドとそのディレクトリで実行されるコマンドを括弧で囲まれたサブシェルに入れることです。角かっこを終了すると、ディレクトリは自動的に以前の状態に復元されます。
答え2
より一般的なソリューションとして使用できますxargs
。このようにして、作業するディレクトリのリストから作業を分離できます。
必要なタスクを実行するスクリプトを作成することから始めます。
Execute_ander.sh
#!/bin/bash
# Exit immediately on error
set -e
if [[ $# -ne 1 ]] ; then
echo "USAGE: $0 DIRECTORY" >&2
exit 1
fi
cd "$1"
ls -l ander ander.band ander.data
cat ander.in
cat ander.log
pwd
スクリプトを実行可能としてマークします。
chmod +x perform_ander.sh
最後に実行:
find -type d -name 'E*_U' | xargs -n1 ./perform_ander.sh
説明する
探す
このfind
コマンドは、一致するすべてのファイルをstdoutに出力します。
-type d
ディレクトリに検索を制限する
-name 'E*_U'
globに一致するディレクトリに検索を制限します。
パラメータ
コマンドはxargs
標準入力を引数ソースとして使用し、その引数を使用して指定されたコマンドを呼び出します。
-n1
一度に1つ以下のパラメーターが渡されることを指定します。