我有一个shell脚本,它基本上搜索一个位置内的所有文件夹,然后使用grep查找我想要定位的确切文件夹。
for dir in /root/*; do
grep "Apples" "${dir}"/*.* || continue
当grep成功找到我的目标目录时,我仍然坚持如何移动我想在目标目录中移动的文件夹。我有一个想法是进入grep输出,但这就是我卡住的地方。尝试了一些谷歌搜索结果,没有人对我的案例有帮助。
示例grep输出:二进制文件/root/ant/containers/secret/Documents/2FD412E0/file.extension matches
我想要进入2FD412E0
并在该目录中移动两个文件夹。
答案 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