【问题标题】:Extract PATH from filename从文件名中提取 PATH
【发布时间】:2020-12-16 23:15:30
【问题描述】:

需要复制超过 100.000 个文件的列表(没有 .ABC.DEF 扩展名!)。 目前我正在使用 while 结合 /opt/project/ 目录中的 find 命令来生成完整的 PATH 以便我可以复制他们以后。

while read LINE; do find opt/project/TOP3RST_0_/ -name "$LINE"*; done <  < TOP3RST_0_file.list > PATH_TOP3RST_0_file.list

这个过程会慢慢来。我想知道是否可以使用 awk、sed 或其他东西从文件列表中创建完整的 PATH。另外,如果我可以检查每个文件是否确实存在,那将是一个奖励。

从此

BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002 BT_SUPR_TOP3RST_0__20200716T005308_20200716T005352_0002 BT_SUPR_TOP3RST_0__20200716T005653_20200716T005748_0002 BT_SUPR_TOP3RST_0__20200716T005752_20200716T005824_0002 BT_SUPR_TOP3RST_0__20200716T010842_20200716T011051_0002

预期的输出路径应该是这样的

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002.ABC

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002.DEF

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T005308_20200716T005352_0002/BT_SUPR_TOP3RST_0__20200716T005308_20200716T005352_0002.ABC

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T005308_20200716T005352_0002/BT_SUPR_TOP3RST_0__20200716T005308_20200716T005352_0002.DEF

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T005653_20200716T005748_0002/BT_SUPR_TOP3RST_0__20200716T005653_20200716T005748_0002.ABC

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T005653_20200716T005748_0002/BT_SUPR_TOP3RST_0__20200716T005653_20200716T005748_0002.DEF

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T005752_20200716T005824_0002/BT_SUPR_TOP3RST_0__20200716T005752_20200716T005824_0002.ABC

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T005752_20200716T005824_0002/BT_SUPR_TOP3RST_0__20200716T005752_20200716T005824_0002.DEF

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T010842_20200716T011051_0002/BT_SUPR_TOP3RST_0__20200716T010842_20200716T011051_0002.ABC

/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T010842_20200716T011051_0002/BT_SUPR_TOP3RST_0__20200716T010842_20200716T011051_0002.DEF

最后我需要计算时间间隔:

BT_SUPR_TOP3RST_0__20200716T003457_20100716T004736_0002.ABC

20200716T003457 = 2020-07-16 00:34:57

20200716T004736 = 2020-07-16 00:47:36

我认为像datediff 这样的东西可以计算出差距吗?

【问题讨论】:

  • Tl;博士,拜托。样本数据是什么,预期的输出是什么?你把我弄丢了,
  • 你读过MCVE 吗?也输了。始终尝试简化/缩小问题
  • 我有这个权利吗?您的进程有一个文件名,并且只有一个文件名。您不知道该文件在哪里,但完整路径已编码在文件名中。所以你必须解析文件名才能确定它的位置?而且解析太慢了?但是创建该文件的进程必须知道它在哪里?但只传递文件名? 更改创建过程以传递整个路径。 这样文件名就不必重复路径中包含的信息 - 这是无用的冗余。
  • 这真的很难读。你能更好地描述你的问题吗?你从哪里读取路径?它是一个文本文件吗?能否也提供完整的 sn-p?
  • "$LINE"* 很奇怪,你想要"$LINE*"This process is going to slowly 当然是 - 你正在运行 find 100000 次...运行 one find 将所有 -name .. -o -name othername -o -name anothername etc.but I need the full PATH to locate 为什么?只需添加"$PWD/ 即可查找参数。不管怎样,你从复制一些文件开始你的帖子。然后你发布了一些find 执行命令行。然后您发布了一些需要添加后缀和前缀的行。这一切都有关系吗?您想加快 find 的速度还是创建一个带有 .ABC .DEF 扩展名的列表?

标签: linux bash shell awk sed


【解决方案1】:

下面的sed 行可以让你开始:

$ sed 's@.*__\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*@/opt/project/TOP3RST_0_/\1/\2/\3/&/&@; s/.*/&.ABC\n&.DEF/' <<<'BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002'
/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002.ABC
/opt/project/TOP3RST_0_/2020/07/16/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002/BT_SUPR_TOP3RST_0__20200716T004902_20200716T005113_0002.DEF

整行与反向引用保存的年月日相匹配。然后生成正确的模式。使用第二个s 命令会输出带有不同后缀的两行。对于学习正则表达式,我推荐网络上可用的正则表达式填字游戏。 This sed 介绍很棒,但是这里只使用了s 命令。 FAQ:&amp; 是整个匹配模式,s 命令可以使用任何字符作为分隔符。

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 2018-09-02
    • 2021-08-31
    • 2015-03-19
    • 1970-01-01
    • 2014-10-04
    • 2016-06-19
    • 2018-10-24
    相关资源
    最近更新 更多