用bash循环文件

时间:2014-09-05 09:00:44

标签: bash file loops

我在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

非常感谢您的帮助,

格列勃

3 个答案:

答案 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},其中se对应于起始和结束索引的数字(不包括在内)。它也让你使用负数,这是从末尾的偏移量。换句话说:${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