递归读取文件夹,并在他们每个人的执行命令(Recursively read folders and

2019-07-03 18:23发布

我试图递归文件夹,并在它上面运行的命令,使用bash脚本。 有什么建议?

Answer 1:

如果你想递归到目录,执行对那些被发现的每个文件的命令,我会使用find命令,而不是使用shell脚本写任何东西,我想。

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


例如,发现是一个目前我在下面的目录:

find . -type d -exec echo "Hello, '{}'" \;

这将让我somehthing这样的:

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
  • 很多的教程与谷歌发现,像,例如, Unix的查找命令教程


Answer 2:

猛砸4.0引入了globstar选项,这样一个结构,如:

for f in mydir/**/*
do
  # operations here
done

...将递归行事$ F无论土地上。 与“禁用了javascript -s globstar”启用该选项,否则**将被视为一个单一的*。

今天发现这种宝石在http://www.linuxjournal.com/content/globstar-new-bash-globbing-option ,通过zsh的结构(我已经默认启用)的启发之后。



Answer 3:

这样的事情应该实现自己的目标:

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
}


Answer 4:

一些基本的炮弹错过命令,如“查找”和他们的一些命令不支持递归性。 在这种情况下,你可以使用这个脚本在树中的所有子目录运行所需的命令:

CDIR=$(pwd)
for i in $(ls -R | grep :); do
    DIR=${i%:}                    # Strip ':'
    cd $DIR
    $1                            # Your command
    cd $CDIR
done

如果你的名字上面的“recurse.sh”,然后使用:

./recurse.sh <command>

实施例(所有者/组改变到树中的所有文件的“根”):

./recurse.sh "chown 0:0 *"


Answer 5:

对不起,我不明白你的要求。 我可以用你的问题想最好的是

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


Answer 6:

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



Answer 7:

对于大多数递归文件操作,要使用find ,作为其他的答案解释。

有包括在递归bash脚本的一个例子的bash-doc的包。 如果你已经安装了这些例子,这将是/usr/share/doc/bash/examples/functions/recurse (在Debian)。



文章来源: Recursively read folders and executes command on each of them
标签: bash shell