如何将cd转换为grep输出



我有一个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

相关内容

  • 没有找到相关文章

最新更新