首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建bash脚本以在每个目录中创建目录和特定文件

如何创建bash脚本以在每个目录中创建目录和特定文件
EN

Stack Overflow用户
提问于 2022-07-14 10:52:01
回答 2查看 39关注 0票数 0

我编写了一个bash脚本,试图生成一个目录,该目录以运行脚本的目录中的每个文件命名。

原始directory= /home/ag肺泡/data//sims/phylip_格式

代码语言:javascript
复制
sim1.phylip
sim2.phylip

要创建的目录= sim1 sim2

这些新目录的内容应该是命名新目录的原始文件的副本,以及一个名为"input“的额外文件。该文件应包含.phylip文件的名称以及以下内容:

代码语言:javascript
复制
"Name of original file"
U
5
Y
/home/agalvez/data/sims/trees/tree_nodenames.txt

之后,我想在所有这些新目录中运行以下命令(顺序):

代码语言:javascript
复制
phylip dollop < input > screenout

我的方法如下,但不起作用:

代码语言:javascript
复制
!/bin/bash

for f in *.phylip;
 mkdir /home/agalvez/data/sims/dollop/$f;
 cp $f /home/agalvez/data/sims/dollop/$f;
 cd /home/agalvez/data/sims/dollop/$f;
 echo "$f" | cat > input;
 echo "U" | cat >> input;
 echo "5" | cat >> input;
 echo "Y" | cat >> input;
 echo "/home/agalvez/data/sims/trees/tree_nodenames.txt" | cat >> input;
 phylip dollop < input > screenout;
;done

编辑:错误混乱看起来如下所示:

代码语言:javascript
复制
line 4: syntax error near unexpected token `mkdir'
line 4: ` mkdir /home/agalvez/data/sims/dollop/$f;'

最后解决办法:

代码语言:javascript
复制
#!/bin/bash

for f in *.phylip; 
 do
 mkdir /home/agalvez/data/sims/dollop/$f;
 cp /home/agalvez/data/sims/phylip_format/$f /home/agalvez/data/sims/dollop/$f;
 cd /home/agalvez/data/sims/dollop/$f;
 echo "$f" | cat > input;
 echo "U" | cat >> input;
 echo "5" | cat >> input;
 echo "Y" | cat >> input;
 echo "/home/agalvez/data/sims/trees/tree_nodenames.txt" | cat >> input;
 phylip dollop < input > screenout;
done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-14 12:56:00

当前的问题是,在循环主体的开头缺少一个do;但是您需要重构这段代码,以避免硬编码目录结构等等。

第一行需要从字面上的两个字符#!开始,这样才能成为有效的谢邦

也请注意何时将引号包装在shell变量的周围?

printf可以用这里的文档代替;我喜欢这里的printf的紧凑性。

代码语言:javascript
复制
#!/bin/bash

for f in *.phylip; do
    mkdir -p dollop/"$f"
    cp "$f" dollop/"$f"
    cd dollop/"$f"
    printf "%s\n" "$f" "U" "5" "Y" \
        "/home/agalvez/data/sims/trees/tree_nodenames.txt" |
    phylip dollop > screenout
done

接下来,尝试使用http://shellcheck.net/来诊断shell脚本中许多常见的初学者问题。

票数 1
EN

Stack Overflow用户

发布于 2022-07-14 11:44:29

假设您在${HOME}文件夹中有一个名为with的目录,其中包含1.txt、2.txt、3.txt文件。你可以这样完成的。修改此代码以满足您的需要。

代码语言:javascript
复制
#! /bin/bash

working_directory="${HOME}/pingping/"

cd $working_directory

for f in *.txt
do
    mkdir "${f%%.*}"
    if [ -f "${f%%.*}.txt" ]
    then
        if [ -d "${f%%.*}" ]
        then
            cp ${f%%.*}.txt ${f%%.*}
            echo "Done copying"
            #phylip dollop < input > screenout
            #echo "Succesfully ran the command
        fi
    else
        echo "not found"
    fi

done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72979307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档