Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
遍历文件以查找字符串,并将包含该字符串的文件发送到bash中同名的目录_Bash_For Loop_Directory_Grep_Cat - Fatal编程技术网

遍历文件以查找字符串,并将包含该字符串的文件发送到bash中同名的目录

遍历文件以查找字符串,并将包含该字符串的文件发送到bash中同名的目录,bash,for-loop,directory,grep,cat,Bash,For Loop,Directory,Grep,Cat,我有一个包含约500个文件的父目录,每个文件名以cert开头,即cert-104.mol2,cert-105.mol2等等。这些cert文件中的每个文件都包含一个七位数的标识符,即7988114。大约有20个唯一的七个数字标识符。我创建了一个目录(unique_ligands),其中包含每个唯一标识符的目录,即名为7988114的目录。每个目录中都有一个带有标识符名称的.mol2文件,即7988114.mol2。总之,文件结构如下所示: /parent/unique_ligands/798811

我有一个包含约500个文件的父目录,每个文件名以
cert
开头,即
cert-104.mol2
cert-105.mol2
等等。这些
cert
文件中的每个文件都包含一个七位数的标识符,即
7988114
。大约有20个唯一的七个数字标识符。我创建了一个目录(
unique_ligands
),其中包含每个唯一标识符的目录,即名为
7988114
的目录。每个目录中都有一个带有标识符名称的
.mol2
文件,即
7988114.mol2
。总之,文件结构如下所示:

/parent/unique_ligands/7988114/7988114.mol2
其中7988114是约20个唯一标识符之一

在包含约500个文件的父目录中,我需要遍历每个证书文件,找出唯一的七号标识符,并将其发送到相应的
identifier.mol2
文件。作为一个bash脚本的初学者,我不确定如何处理这个问题。我为单个标识符编写了执行此过程的代码,
7988114

find . -type f -name 'cert*' -exec grep -q '7988114' {} ';' -exec cp {} ./unique_ligands/7988114 ';'
cd unique_ligands/7988114
bash -c 'cat $(for((i=0;i<10000;i++)); do echo -n "cert-${i}.mol2 "; done) > zzz.txt 2> ./null'
mv zzz.txt 7988114.mol2
rm null
rm cert*
find-键入f-name'cert*'-exec grep-q'7988114'{}';'-exec cp{}./unique_配体/7988114';'
cd独特的_配体/7988114
bash-c'cat$(用于((i=0;i zzz.txt 2>)/null'
mv zzz.txt 7988114.mol2
rm null
rm证书*
我怎样才能把它变成一个循环,能够识别出任何七个数字的标识符?或者有更好的方法来实现这一点吗

编辑

要澄清以上示例代码中每一行的作用:

find…
这一行搜索以文件名
cert
开头的所有~500个文件,并挑选出其内容包含字符串
7988114
的文件,并将其复制到正确的
7988114
目录。每个
cert
文件包含~100行分子坐标、信息关于费用等等

bash-c…
这行循环遍历复制到
7988114
目录中的每个
cert
文件,并将文件内容添加到一个新的文本文件
zzz.txt
。每个
cert
文件的名称类似于
cert-1.mol2
cert-2.mol2
等等。这对我来说至关重要行搜索每个
cert
文件,从1一直到上限10000,然后按顺序将它们添加到
zzz.txt
。我发现的其他示例不是按顺序搜索,就是在查看
cert-2*
文件之前先查看了
cert-1*
文件


mv zzz.txt 7988114.mol2
由于某种原因,我不允许创建上面的
7988114.mol2
文件,所以我在这里创建了它

这里是我找到如何回答上面我自己问题的一种方法(在上面用户Sheller的帮助和启发下-谢谢!):

ls-l|grep^d|awk'{print$9}>list_-ligands.txt
mv list_of_ligands.txt。。
光盘
读名字的时候
做
回显“$NAME”
grep-l“$NAME”证书*| while read-r文件名;do
cp$filename唯一_配体/$NAME
cd唯一_配体/$NAME
bash-c'cat$(用于((i=0;i zzz.txt 2>)/null'
mv zzz.txt$NAME.mol2
rm null
rm证书*
cd../。。
完成
完成
正如我在第一个问题中提到的,我之前为每个7号标识符创建了一个目录。
ls-l
行选择目录名,并创建目录名的垂直列表(这也是我拥有的每个7号标识符)


两个
while
循环遍历我拥有的每个7个数字标识符,并执行我在初始问题中提到的命令。

读取配体时;请查找/path/to/corrct/place/to/start\u look…-cp…“$配体”…;cd唯一配体/“$配体”;bash…${配体};mv..“${配体}”.mol2;rm null;rm cert*;done
这需要一些工作,所以一定要设置一个小的测试环境。另外,您是否真的想要
2>/dev/null
,那么您就不需要
rm null
。祝您好运。感谢您的提示-我尝试使用了2>/dev/null,但始终得到一个错误,说它没有存在。我检查了,它确实存在。半个小时后,我进行了一次毫无结果的搜索,我只是做了一个变通。你从
uname-srv
中得到了什么?是的,你原来的
2>/null;…;rm./null
在这个限制下很好,但这将是第一次!祝你好运。下面是我得到的:
uname-srv
Linux4.15.0-55-generic#60 Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019
Arg,没有理由使用所有这些
bash-c
东西。请给我看
uname-srv
echo$bash\u版本的输出。脚本的第一行应该是
!/bin/bash
。这告诉操作系统使用什么程序来处理文件的其余部分。然后你就可以使用
for((i=0;i zzz.txt
。祝你好运。很高兴你找到了它!祝你好运!(但请注意我对你从上面
bash-c
开始的代码行的评论,你在使用
bash-c
)浪费周期(这可能不会对你的运行时间造成太大影响),但养成低效的习惯是不好的,当你真的需要做点什么的时候,你只会得到piz;-)。继续发帖,祝你好运。
ls -l | grep ^d | awk '{print $9}' > list_of_ligands.txt
mv list_of_ligands.txt ..

cd ..

while read NAME
do
        echo "$NAME"
        grep -l "$NAME" cert* | while read -r filename ; do
        cp $filename unique_ligands/$NAME
        cd unique_ligands/$NAME
        bash -c 'cat $(for((i=0;i<10000;i++)); do echo -n "cert-${i}.mol2 "; done) > zzz.txt 2> ./null'
        mv zzz.txt $NAME.mol2
        rm null
        rm cert*
        cd ../..
done
done < list_of_ligands.txt