首先我要说明的是,我对 bash 和 Linux 还很陌生,所以任何帮助对于你来说都是巨大的,哪怕只是一些对你有用的入门技巧。
我遇到的问题是我正在处理一堆目录和子目录。我正在尝试 grep 一行。
grep 'Relaxed' */*
它并不优雅,但它为我提供了一个目录列表,其中包含一个包含行 Relaxed 的文件(在我的情况下,它是电子结构预测计算的输出)。我有大约 100 多个这样的目录,因此要筛选出哪些目录已完成哪些目录尚未完成,这很繁琐。
我希望得到的帮助是一种搜索每个目录的方法,以及当字符串例如:
松弛原子坐标(分数):
在该目录中的文件(一行轻松就足以识别)中找到,使用 for 循环或其他方法将整个目录移动到完成堆(另一个目录)中,并将未完成的目录保留在目录中。这样我就会有一堆“完成”的目录和可以重新运行的未触及的目录。
再次感谢任何帮助,如果有什么令人困惑的地方我可以澄清。
谢谢你!
答案1
grep -rl 'Relaxed' | xargs dirname | xargs mv -vt donedirectory
慢动作:
grep -rl 'Relaxed'
搜索所有文件并打印出它们的名称。如果它们都在当前目录的第一级子目录中,grep -l 'Relaxed' */*
也可以使用。xargs dirname
调用dirname
该输出的每个文件来打印出目录名称xargs mv -v -t donedirectory
将所有结果目录移动到目标目录。
如果在同一目录中找到多个带有“Relaxed”的文件,则可以通过使目录名称唯一来避免出现错误消息:
grep -rl 'Relaxed' | xargs dirname | sort -u | xargs mv -vt donedirectory
注意:上述命令假设文件/目录名称中不存在任何错误(空格等)。