gpt4 book ai didi

linux - 为什么 cat 命令在脚本中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:59 24 4
gpt4 key购买 nike

我有以下脚本,但有错误。我正在尝试将所有文​​件合并为一个大文件。在命令行中,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

最佳答案

明显的问题是您正在尝试 cat 一个不存在的文件。

次要问题与效率和正确性有关。最好避免运行两个嵌套循环,尽管将操作分为两个步骤在这里只是不优雅;内部循环最多只会执行一次。将命令结果捕获到变量中是初学者常见的反模式;通常可以避免仅使用一次的变量,并避免乱七八糟地乱扔 shell 的内存(并且巧合地解决了缺少引号的多个问题 - 包含文件或目录名的变量基本上应该始终插入双引号中)。重定向最好在任何包含循环之外执行;

rm file
while something; do
another thing >>file
done

将在循环运行时多次打开、查找文件末尾、写入和关闭文件,而

while something; do
another thing
done >file

仅执行一次打开、查找和关闭操作,避免在开始循环之前必须清除文件。尽管您的脚本可以重构为根本没有任何循环;

find ./*/ -type f -name "*.psi_filtered" -execdir cat selectedcombo.txt \;> bigcombo.tsv

根据您的问题,存在包含 combo.txt 但不包含任何 *.psi_filtered 文件的目录可能会出错。也许你想locate and examine these directories.

关于linux - 为什么 cat 命令在脚本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51250112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com