如何进入grep输出?

时间:2016-05-11 13:17:28

标签: bash shell

我有一个shell脚本,它基本上搜索一个位置内的所有文件夹,然后使用grep查找我想要定位的确切文件夹。

for dir in /root/*; do
    grep "Apples" "${dir}"/*.* || continue

当grep成功找到我的目标目录时,我仍然坚持如何移动我想在目标目录中移动的文件夹。我有一个想法是进入grep输出,但这就是我卡住的地方。尝试了一些谷歌搜索结果,没有人对我的案例有帮助。

示例grep输出:二进制文件/root/ant/containers/secret/Documents/2FD412E0/file.extension matches

我想要进入2FD412E0并在该目录中移动两个文件夹。

2 个答案:

答案 0 :(得分:2)

dirname是关键:

cd $(dirname $(grep "...." ...))

将允许您进入目录。

答案 1 :(得分:0)

正如人们所说,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的{​​{1}}选项。请参阅-maxdepth的手册页。

嗯,实际上有更简单的解决方案:)我只想编写bash脚本。您可以简单地使用单个find命令:

find

注意第二个find /root/ -type f -exec grep Apples {} ';' -exec ls -l {} ';' 。如果先前的-exec命令以状态-exec退出(成功),则将执行该命令。从手册页:

  

0               执行命令;如果返回0状态,则返回true。在查找包含-exec command ;的参数之前,将查找所有后续参数作为命令的参数。字符串;将被处理命令参数中出现的任何位置处理的当前文件名替换,而不仅仅是在某些版本的find中的参数中。

用你的东西替换{}命令。

如果您想在ls -l命令中执行dirname,您可以执行以下操作:

-exec

find /root/ -type f -exec grep -q Apples {} ';' \ -exec sh -c 'cd `dirname $0`; pwd' {} ';' 替换为您的内容。

pwd无法使用时

在您写的评论中,find在您的系统上不可用。以下解决方案不使用find

find