[英]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.