我有一个shell脚本,它基本上搜索一个位置内的所有文件夹,并使用grep来找到我想要的确切文件夹。
for dir in /root/*; do
grep "Apples" "${dir}"/*.* || continue
虽然grep成功地找到了我的目标目录,但我一直在思考如何在目标目录中移动我想移动的文件夹。我的一个想法是cd到grep输出,但这就是我陷入困境的地方。尝试了一些谷歌搜索结果,但对我的情况没有任何帮助。
示例grep输出:二进制文件/root/ant/containers/secret/Documents/2FD412E0/file.extension matches
我想cd到2FD412E0
中,并在该目录中移动两个文件夹。
目录名是关键:
cd $(dirname $(grep "...." ...))
将允许您进入目录。
正如人们所提到的,dirname
是从路径中去掉文件名的合适工具。
我会使用find
来完成这样的任务:
while read -r file
do
target_dir=`dirname $file`
# do something with "$target_dir"
done < <(find /root/ -type f
-exec grep "Apples" --files-with-matches {} ;)
考虑使用find
的-maxdepth
选项。请参阅find
的手册页。
实际上,还有一个更简单的解决方案:)我只是喜欢写bash脚本。您可以简单地使用单个find
命令,如下所示:
find /root/ -type f -exec grep Apples {} ';' -exec ls -l {} ';'
注意第二个-exec
。如果上一个-exec
命令退出,状态为0
(成功),则执行该命令。来自手册页:
-exec command ;
执行命令;如果返回0状态,则为true。在遇到由;
组成的参数之前,要查找的所有以下参数都将被视为命令的参数。字符串{}
在命令的参数中出现的任何位置都会被正在处理的当前文件名替换,而不仅仅是在单独存在的参数中,就像在某些版本的find中一样。
用你的东西替换ls -l
命令。
如果您想在-exec
命令中执行dirname
,您可以执行以下技巧:
find /root/ -type f -exec grep -q Apples {} ';'
-exec sh -c 'cd `dirname $0`; pwd' {} ';'
用你的东西替换pwd
。
当find
不可用时
在您写的评论中,find
在您的系统中不可用。以下解决方案在没有find
的情况下有效:
grep -R --files-with-matches Apples "${dir}" | while read -r file
do
target_dir=`dirname $file`
# do something with "$target_dir"
echo $target_dir
done