cdはすべてのディレクトリに入り、そのディレクトリのファイルに対してコマンドを実行し、以前の現在のディレクトリに戻ります。

cdはすべてのディレクトリに入り、そのディレクトリのファイルに対してコマンドを実行し、以前の現在のディレクトリに戻ります。

単一レベルのサブディレクトリが多数ある特定のディレクトリで実行されるスクリプトを作成しようとしています。スクリプトは各サブディレクトリにCDを移動し、ディレクトリ内のファイルに対してコマンドを実行してから、CDを介して次のディレクトリに移動し続けます。これを行う最良の方法は何ですか?

答え1

for d in ./*/ ; do (cd "$d" && somecommand); done

答え2

cd最善の方法はまったく使用しないことです。

find some/dir -type f -execdir somecommand {} \;

execdir同様execですが、作業ディレクトリが異なります。

-execdir command {} [;|+]
  Like   -exec,   but  the  specified  command  is  run  from  the
  subdirectory containing the matched file, which is not  normally
  the  directory  in  which  you  started  find.  This a much more
  secure  method  for  invoking  commands,  as  it   avoids   race
  conditions  during resolution of the paths to the matched files.

POSIXではありません。

答え3

for D in ./*; do
    if [ -d "$D" ]; then
        cd "$D"
        run_something
        cd ..
    fi
done

答え4

方法1:

for i in `ls -d ./*/`
do
  cd "$i"
  command
  cd ..
done

方法2:

for i in ./*/
do
  cd "$i"
  command
  cd..
done

方法3:

for i in `ls -d ./*/`
do
  (cd "$i" && command)
done

これが役に立つことを願っています。すべての順列と組み合わせを試すことができます。

ありがとう:)

関連情報