繁体   English   中英

与nohup兼容的shell脚本中的ls的替代

[英]Alternative to ls in shell-script compatible with nohup

我有一个shell脚本,其中列出了目录中的所有文件名,并将它们存储在新文件中。

问题在于,当我使用nohup命令执行此脚本时,它会四次列出名字,而不是列出正确的名字。

与其他程序员一起评论问题时,他们认为问题可能出在ls命令上。

我的代码的一部分如下:

for i in $( ls -1 ./Datasets/); do
    awk  '{print $1}'  ./genes.txt | head -$num_lineas | tail -1 >> ./aux   
    let num_lineas=$num_lineas-1    
done

您是否知道可以与nohup一起使用的ls替代方法?

谢谢。

不要使用ls来填充循环,请使用:

for i in ./Datasets/*; do

或如果感兴趣的子目录

for i in ./Datasets/*/*; do

最后,更正确地说,如果需要Datasets下面的整个树,请使用find

find ./Datasets -type f | while IFS= read -r file; do
    (do stuff with $file)
done

其他人皱着眉头,但使用find as也没有错:

for file in $(find ./Datasets -type f); do
    (do stuff with $file)
done

只需选择最能满足您需求的语法即可。

首先, 不要解析ls 一个简单的glob就足够了。 其次,您的awk | head | tail awk | head | tail 通过仅打印您对使用awk感兴趣的行的第一列,可以简化awk | head | tail链。 第三,您可以将循环的输出重定向到文件,而不是使用>>

将所有这些更改合并到脚本中:

for i in Datasets/*; do
    awk  -v n="$(( num_lineas-- ))" 'NR==n{print $1}' genes.txt
done > aux

每次循环执行时, $num_lineas的值将减少1。

对于您的nohup问题,我建议您考虑使用screen东西,众所周知, screen是维持登录之间会话的更好解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM