次のコードを実行しています。
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/