我在shell脚本方面不是很好,想问你一些关于文件循环大数据集的问题:在我的例子中,我在工作目录中有很多带有常见.pdb扩展名的文件。我需要循环所有这些并且i)打印每个循环文件的名称(w.o pdb扩展名)并在此之后进行一些操作。例如,我需要使用每个文件的名称为workdir之外的EACH文件创建新目录,并将此文件复制到该目录。下面你可以看到我的代码没有工作的例子 - 它没有显示文件的名称,也没有为每个文件创建文件夹。请更正并告诉我错误的地方
#!/bin/bash
# set the work dir
receptors=./Receptors
for pdb in $receptors
do
filename=$(basename "$pdb")
echo "Processing of $filename file"
cd ..
mkdir ./docking_$filename
done
非常感谢您的帮助,
格列勃
答案 0 :(得分:1)
如果您的所有文件都包含在.Repectors
文件夹中,您可以像这样循环每个文件:
#!/bin/bash
for pdb in ./Receptors/*.pdb ; do
filename=$(basename "$pdb")
filenamenoextention=${filename/.pdb/}
mkdir "../docking_${filenamenoextention}"
done
顺便说一下:
filenamenoextention=${filename/.pdb/}
搜索是否替换变量$pdb
。语法为$ {myvariable / FOO / BAR},并将$myvariable
中的所有“FOO”子串替换为“BAR”。在你的情况下,它取而代之的是“.pdb”,有效地删除它。
或者,更安全(如果$filename
包含多个".pdb"
- 子字符串)是删除最后四个字符,如下所示:filenamenoextention=${filename:0:-4}
此处的语法为${myvariable:s:e}
,其中s
和e
对应于起始和结束索引的数字(不包括在内)。它也让你使用负数,这是从末尾的偏移量。换句话说:${filename:0:-4}
说:从索引0开始从$filename
提取子字符串,直到您到达倒数第四个字符。
您的脚本存在一些问题:
for pdb in ./Receptors
仅循环"./Receptors"
,而不是文件夹中的每个文件。
当您更改为父目录(cd ..
)时,您将对当前的shell会话执行此操作。这意味着您每次都会继续访问父目录。相反,您可以在mkdir
调用中指定父目录。 E.g mkdir ../thedir
答案 1 :(得分:0)
你正在循环一个项目列表,我想你想得到的是./Receptors的内容列表:
...
for pdb in $receptors/*
...
答案 2 :(得分:0)
仅列出扩展名为.pdb的文件,使用$ receptors / * .pdb
所以不要只是在for循环中给出路径,而是给出:
for pdb in $receptors/*.pdb
删除扩展程序:
将变量ext设置为要删除的扩展名,并使用shell扩展运算符"%"从文件名中删除扩展名,例如:
ext=.pdb
filename=${filename%${ext}}
您可以在不更改当前目录的情况下创建新目录:
因此,要在当前目录之外创建目录,请使用以下命令
mkdir ../ docking_ $ filename
要在新目录中复制文件,请使用cp命令
纠正后 您的脚本应如下所示:
receptors=./Receptors
ext=.pdb
for pdb in $receptors/*.pdb
do
filename=$(basename "$pdb")
filename=${filename%${ext}}
echo "Processing of $filename file"
mkdir ../docking_$filename
cp $pdb ../docking_$filename
done