遍历文件以查找字符串,并将包含该字符串的文件发送到bash中同名的目录
我有一个包含约500个文件的父目录,每个文件名以遍历文件以查找字符串,并将包含该字符串的文件发送到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
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