【问题标题】:How can I loop through consecutive file directories?如何遍历连续的文件目录?
【发布时间】:2022-11-26 04:06:51
【问题描述】:

我在目录a中。在目录a下有一个固定的目录b。 b目录下有d{091....099}目录。这个d目录下还有不同的*.gz文件。我需要从这些文件(文件名)中提取数据并一个接一个地打印它们。

我试过这个:

#!/bin/bash

for file in $(find . -name "*.gz"); do
  file=$(basename ${file})
       echo ${file:0:4} | tee -a receiver_ids > log
       echo ${file:16:17} | tee -a doy > log2
       echo ${file:0:100} | tee -a data_record > log3
done
cut -c 1-3 < doy > doy2
cut -c 1-23 < data_record > summary_name

但是通过这样做,文件以无序方式处理。这就是我得到的,

cat data_record
ISTA00TUR_R_20190940000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190990000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190970000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190920000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190980000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190910000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190960000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190930000_01D_30S_MO.crx.gz
ISTA00TUR_R_20190950000_01D_30S_MO.crx.gz

我怎样才能解决这个问题?

【问题讨论】:

  • 目标操作系统是什么?您可能需要特定的扩展名来处理您的文件,同时按文件名对它们进行排序。顺便说一句,for f in $(...) 是一个损坏的结构,不要使用它
  • 我正在尝试在 shell 上编写 bash 代码。我正在通过服务器连接。使用了ubuntu,但我不知道它的版本。
  • 您确定要 loglog2log3 只包含最后处理的文件吗?另外,receiver_idsdoydata_record真的需要保留上次运行脚本的结果吗?

标签: bash loops for-loop


【解决方案1】:

“文件以无序方式处理”——可能是因为命令find ... 没有按照您想要的顺序给出结果。

这个怎么样

for file in b/d*/*gz; do
  ...
done

或者

for file in $(find . -name "*.gz" | sort); do
  ...
done

顺便说一句,如果我是你,我不会使用file这个名字,因为有一个程序叫file,容易混淆。

【讨论】:

  • 我已经尝试过第一个,但没有成功。第二个是工作!太感谢了。
【解决方案2】:

当您运行 Ubuntu 时,我假设您可以访问标准工具的 GNU 版本。

似乎您想对您的文件路径经过文件名.这有点复杂,但这里有一种方法可以稳健且高效地完成任务:

#!/bin/bash

find . -name '*.gz' -printf '%f
猜你喜欢
  • 2011-06-22
  • 2021-07-09
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多