ディレクトリを変更してコマンドを自動化し、ディレクトリを再変更します。

ディレクトリを変更してコマンドを自動化し、ディレクトリを再変更します。

単一レベルのサブディレクトリが多数ある特定のディレクトリで実行されるスクリプトを作成しようとしています。スクリプトはcd各サブディレクトリに移動し、ディレクトリ内のファイルに対してコマンドを実行して終了し、cd次のディレクトリに進みます。

出力は、元のディレクトリと同じ構造と名前を持つ新しいディレクトリに返される必要があります。これを行う最良の方法は何ですか?

ベストアンサー1

最良の方法はサブシェルを使用することです。

for dir in */; do
  (cd -- "$dir" && some command there)
done

次の状況を避けてください。

for dir in */; do
  cd -- "$dir" || continue
  some command there
  cd ..
done

または:

here=$PWD
for dir in */; do
  cd -- "$dir" || continue
  some command here
  cd "$here"
done

これは、シンボリックリンクが含まれている場合、またはスクリプトを実行すると現在のディレクトリのパスが変更される可能性がある場合、信頼性が低下するためです。

サブシェルを含まない「正しい」方法は、close-on-execフラグを使用してファイル記述子で現在のディレクトリを開き、サブディレクトリにchdir()移動しますfchdir(fd)。シェルはこれをサポートします。

しかし、あなたはこれを行うことができますperl

#! /usr/bin/perl

opendir DIR, "." or die "opendir: $!";
while (readdir DIR) {
  if (chdir($_)) {
    do-something-there;
    chdir DIR || die "fchdir: $!";
  }
}
closedir DIR

おすすめ記事