我有以下脚本,它有一个错误。我正在尝试将所有文件合并为一个大文件。通过命令行,cat命令可以正常工作,并将内容打印到重定向的文件中。通过脚本,它可以在某个时间运行,而在其他时间则不能。我不知道为什么它的行为异常。请帮忙。
#!/bin/bash
### For loop starts ###
for D in `find . -type d`
do
combo=`find $D -maxdepth 1 -type f -name "combo.txt"`
cat $combo >> bigcombo.tsv
done
这是bash -x app.sh
++ find . -type d
+ for D in '`find . -type d`'
++ find . -maxdepth 1 -type f -name combo.txt
+ combo=
+ cat
^C
更新: 以下对我有用。路径有问题。我仍然不知道问题出在什么地方,所以欢迎回答。
#!/bin/bash
### For loop starts ###
rm -rf bigcombo.tsv
for D in `find . -type d`
do
psi=`find $D -maxdepth 1 -type f -name "*.psi_filtered"`
# This will give us only the directory path from find result i.e. removing filename.
directory=$(dirname "${psi}")
cat $directory"/selectedcombo.txt" >> bigcombo.tsv
done
答案 0 :(得分:2)
一个明显的问题是您试图cat
一个不存在的文件。
次要问题与效率和正确性有关。最好避免运行两个嵌套循环,尽管将操作分为两个步骤仅是微不足道的。内部循环最多只会执行一次。将命令结果捕获到变量中是常见的初学者反模式;通常可以避免只使用一次的变量,并且避免乱码乱扔外壳的内存(同时解决了缺少引号的多个问题-包含文件或目录名称的变量基本上应该始终用双引号内插)。重定向最好在任何包含循环之外执行;
rm file
while something; do
another thing >>file
done
将打开,查找到文件末尾,写入和关闭文件,循环次数不计其数,而
while something; do
another thing
done >file
仅执行一次open,seek和close操作,并且避免在开始循环之前必须清除文件。尽管您的脚本可以重构为根本没有任何循环;
find ./*/ -type f -name "*.psi_filtered" -execdir cat selectedcombo.txt \;> bigcombo.tsv
根据您的问题,目录包含combo.txt
但不包含任何*.psi_filtered
文件可能是错误的。也许您想locate and examine these directories.