我试图递归文件夹,并在它上面运行的命令,使用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)。