遍历所有子目录并在Unix shell脚本中执行一些操作

遍历所有子目录并在Unix shell脚本中执行一些操作

我希望我的 shell 脚本能够访问主目录中的所有子目录。在目录中执行某些操作,将输出发送到假脱机文件,然后转到下一个目录。考虑 Main Dir = /tmp Sub Dir = ABCD (四个子目录)

答案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 shell 脚本中完成,但在过去我们常常find [-maxdepth <levels>] <start-dir> -exec <command> ;这样做。你可以做一个man find并尝试一下,也许直到有人告诉你如何做bash

答案3

看起来您想要每个子目录下的文件名;不够ls -l | awk强大,如果这些文件名包含空格和/或换行符怎么办?即使对于那些碰巧不适合他们的 s ,以下内容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" \;

相关内容