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