Bash 递归读取文件夹并对每个文件夹执行命令

Bash 递归读取文件夹并对每个文件夹执行命令,bash,shell,Bash,Shell,我正在尝试递归到文件夹中,然后使用bash脚本对其运行命令。有什么建议吗?看看查找命令,检查开关-type(使用d指定目录)和-exec(指定要执行的命令)。如果要递归到目录中,对其中找到的每个文件执行命令,我将使用查找命令,我想不是用shell脚本写任何东西 该命令可以接收大量参数,如过滤返回的文件类型的type,或对每个结果执行命令的exec 例如,要查找我当前所在目录下的目录: find . -type d -exec echo "Hello, '{}'" \; 这会让我得到一些东西,

我正在尝试递归到文件夹中,然后使用bash脚本对其运行命令。有什么建议吗?

看看
查找
命令,检查开关
-type
(使用d指定目录)和
-exec
(指定要执行的命令)。

如果要递归到目录中,对其中找到的每个文件执行命令,我将使用
查找
命令,我想不是用shell脚本写任何东西

该命令可以接收大量参数,如过滤返回的文件类型的
type
,或对每个结果执行命令的
exec


例如,要查找我当前所在目录下的目录:

find . -type d -exec echo "Hello, '{}'" \;
这会让我得到一些东西,比如:

Hello, '.'
Hello, './.libs'
Hello, './include'
Hello, './autom4te.cache'
Hello, './build'
Hello, './modules'

与查找当前目录下的文件相同:

find . -type f -exec echo "Hello, '{}'" \;
这会让我得到这样的东西:

Hello, './config.guess'
Hello, './config.sub'
Hello, './.libs/memcache_session.o'
Hello, './.libs/memcache_standard_hash.o'
Hello, './.libs/memcache_consistent_hash.o'
Hello, './.libs/memcache.so'
Hello, './.libs/memcache.lai'
Hello, './.libs/memcache.o'
Hello, './.libs/memcache_queue.o'
Hello, './install-sh'
Hello, './config.h.in'
Hello, './php_memcache.h'
...

有人会说“这不是贝壳”。。。但是为什么要重新发明轮子呢?
(从某种意义上说,这就是壳牌公司)


有关更多信息,您可以查看:

  • man-find
  • 谷歌提供了很多教程,比如

    • 对不起,我不明白你在问什么。我对你的问题所能猜到的最好的答案是

      find -type d -exec scriptname.sh \{\} \;
      

      对于大多数递归文件操作,您希望使用
      查找
      ,正如其他答案所解释的那样


      包中包含一个递归bash脚本示例。如果您已经安装了这些示例,它将位于
      /usr/share/doc/bash/examples/functions/recurse
      (在Debian上)。

      类似的内容应该可以实现您的目标:

      function RecurseDirs
      {
          oldIFS=$IFS
          IFS=$'\n'
          for f in "$@"
          do
          -----your activity here-----
              if [[ -d "${f}" ]]; then
                  cd "${f}"
                  RecurseDirs $(ls -1 ".")
                  cd ..
              fi
          done
          IFS=$oldIFS
      }
      

      一些基本shell缺少“find”等命令,并且它们的一些命令不支持递归性。 在这种情况下,您可以使用此脚本在树中的所有子目录中运行所需的命令:

      CDIR=$(pwd)
      for i in $(ls -R | grep :); do
          DIR=${i%:}                    # Strip ':'
          cd $DIR
          $1                            # Your command
          cd $CDIR
      done
      
      ./recurse.sh "chown 0:0 *"
      
      如果将上述名称命名为“recurse.sh”,则使用:

      ./recurse.sh <command>
      

      Bash 4.0引入了globstar选项,因此类似于:

      for f in mydir/**/*
      do
        # operations here
      done
      
      …将递归地作用于$f中的任何土地。使用“shopt-s globstar”打开此选项,否则**将被视为单数*


      受zsh构造(我默认启用了zsh构造)的启发,今天在找到了这颗宝石。

      问题还不清楚。您只是想使用find对给定目录下的所有文件执行命令吗?答案在我的否决票中:)我只想重命名目录下的所有文件如果您需要递归重命名目录和文件,请查看此答案:谢谢。我将如何调整它以只查找当前目录的子目录,而不查找子目录。像这样:
      find-maxdepth 1-类型d-exec echo“Hello,{}'”\如何使其使用函数?我用
      wavogg(){stuff}
      定义了它,而
      find
      只是说
      'wavogg':没有这样的文件或目录
      实际上,它似乎也不适用于
      cd
      <代码>查找-类型d-execcd“{}”
      在这种情况下,脚本将在每个目录中执行?不,脚本将在
      find
      的位置执行。