単一レベルのサブディレクトリが多数ある特定のディレクトリで実行されるスクリプトを作成しようとしています。スクリプトは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