すべてのサブディレクトリを繰り返し、Unixシェルスクリプトでいくつかの操作を実行します。

すべてのサブディレクトリを繰り返し、Unixシェルスクリプトでいくつかの操作を実行します。

私のシェルスクリプトが私のホームディレクトリ内のすべてのサブディレクトリにアクセスできるようにしたいです。ディレクトリでいくつかのタスクを実行し、出力をスプールファイルに送信してから、次のディレクトリに移動します。デフォルトディレクトリ= /tmpサブディレクトリ= ABCD(サブディレクトリ4つ)を考えてみましょう。

答え1

forループを使用してください。

for d in $(find /path/to/dir -maxdepth 1 -type d)
do
  #Do something, the directory is accessible with $d:
  echo $d
done >output_file

そのディレクトリのサブディレクトリのみを検索します/path/to/dir。ディレクトリ名にスペースや特殊文字が含まれている場合、上記の簡単な例は失敗します。より安全なアプローチは次のとおりです。

find /tmp -maxdepth 1 -type d -print0 |
  while IFS= read -rd '' dir; do echo "$dir"; done

または単純にbash

for d in /path/to/dir/*; do
  if [ -d "$d" ]; then
    echo "$d"
  fi
done

(逆に、findディレクトリへのシンボリックリンクも考慮し、隠されたシンボリックリンクは除外します。)

答え2

私は完全bash初心者ですが、UN * Xベテランです。 Bashシェルスクリプトでこれを行うことができるという疑いはありませんが、find [-maxdepth <levels>] <start-dir> -exec <command> ;過去にはそうしました。誰かが方法を教えてくれるまで作ってみてman findくださいbash

答え3

各サブディレクトリの下のファイル名が不足しているようです。ls -l | awkそのファイル名にスペースや改行文字が含まれている場合はどうなりますか?偶然に働いていない人にも以下がfind適用されます。find-maxdepth

find . ! -name . -type d -prune -exec sh -c '
   cd "$1" && \
   find "." ! -name . -prune  -type f
' {} {} \;

答え4

私は解決を得た。以下のfindコマンドは私の要件を満たしています。

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;

関連情報