Forループは機能しますが、2回繰り返されます。

Forループは機能しますが、2回繰り返されます。

次のコードを実行しています。

for d in ./*/ ; do (cd "$d" && dcm2nii -n y -r y -x y -g n ../*/dicom/); done;

./*/(すべてのタイトルは「dicom」です)のすべてのサブフォルダでdcm2niiプログラムを実行し、出力を同じサブフォルダに保存します.ループは機能しますが、2回実行され、各「dicom」サブフォルダに重複した出力ファイルが生成されます。興味深いことに、両方の場所に絶対パスを指定し、親ディレクトリのすべてのフォルダを含めるためにワイルドカード*を残すと、ループは必要に応じて一度だけ実行されます。ループが一度だけ実行されるようにするには、相対パスをどのように使用しますか?

答え1

コマンドをテスト/実行するときに2つのサブフォルダがあるようです。

あなたのコード:

for d in ./*/ ; do (cd "$d" && dcm2nii -n y -r y -x y -g n ../*/dicom/); done;
  • まず、サブフォルダに移動します。$d
  • その後、スーパーフォルダ内のすべてのフォルダのサブフォルダ「dicom」に翻訳され、実行されますdcm2nii ...../*/dicom
  • 次に、2番目のサブフォルダに移動して同じことを行います。

この試み:

for d in ./*/ ; do (cd "$d" && dcm2nii -n y -r y -x y -g n dicom/); done;

または(おそらく)次のようになります。

dcm2nii -n y -r y -x y -g n ../*/dicom/

関連情報