【问题标题】:Move files having one or two digits in name at certain point在特定点移动名称中包含一位或两位数字的文件
【发布时间】:2015-03-06 18:39:51
【问题描述】:

假设我有一个文件夹,其中包含名称格式为foo<number1>.bar.o<number2> 的文件。 <number1> 可以由 123 数字组成。

现在,如果出于某种奇怪的原因,我只想移动 <number1>12 数字组成的文件,而不是 3,我会编写一个 python 脚本:

#!/bin/python
import glob, shutil, re
for f in glob.glob("*.bar.o*"):
    print f
    numbers = map(int, re.findall('\d+', f))
    print numbers
    if numbers[0] < 100:
        shutil.move(f, "dir/" + f)

现在的问题:如果用更少的代码(例如在一行中(最多 80 个字符)),如何才能做到这一点?

希望有一个可以在bash shell 中使用的解决方案。

【问题讨论】:

  • 您是否尝试过自己在 bash 中解决这个问题?如果是这样,你在哪里卡住了?
  • @TomFenech 在bash 部分,真的。我的问题更多是基于对其他解决方案的兴趣,因为我知道我花了大约 10 分钟的代码在大小上远非最佳。我现在确实看到了一个缺陷,即它不是一个真正的问题,或者是一个问题,但我仍然感兴趣。

标签: python regex bash mv


【解决方案1】:

除非我误解了你的意思:

mv foo[0-9][0-9].bar* /wherever/you/like

将捕获 2 位数字

你可以这样做:

 mv $(ls |egrep "foo[0-9]{1,2}.bar") /wherever/you/like

【讨论】:

  • 您可以尝试使用{0..99} 来捕获所有一位和两位数字,而不是[0-9][0-9]
  • 哎呀,是的,它只会捕获 2 位数字,而不是 1
  • @hgazibara 虽然它可以工作,但如果无法找到该范围内的某些数字,它也会给出错误...
  • @TheJustist 然后你可以让mv 静默失败,或者使用管道首先找到所有匹配模式的文件,然后只移动找到的文件。
  • 放一个更全面的选项。
【解决方案2】:

匹配foo&lt;number1&gt;.bar.o&lt;number2&gt;

for filename in *.bar.o*; do

    # 1. with a shell regex
    [[ $filename =~ ^foo[[:digit:]]{1,2}\.bar\.o[[:digit:]]+$ ]] && echo $filename

    # 2. with expanded globbing: shopt -s extglob
    [[ $filename == foo[[:digit:]]?([[:digit:]]).bar.o+([[:digit:]]) ]] && echo $filename

done

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2019-10-13
    • 2021-03-27
    • 2016-11-06
    相关资源
    最近更新 更多