Python 在某一点移动名称中有一个或两个数字的文件

Python 在某一点移动名称中有一个或两个数字的文件,python,regex,bash,mv,Python,Regex,Bash,Mv,比如说,我有一个文件夹,里面装满了文件,文件名的格式是foo.bar.o可以由1、2或3数字组成 现在,如果出于某种奇怪的原因,我只想移动由1或2数字组成的文件,而不是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

比如说,我有一个文件夹,里面装满了文件,文件名的格式是
foo.bar.o
<代码>可以由
1
2
3
数字组成

现在,如果出于某种奇怪的原因,我只想移动
1
2
数字组成的文件,而不是
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)
#/bin/python
进口glob、shutil、re
对于glob.glob(“*.bar.o*”)中的f:
打印f
数字=映射(int,re.findall('\d+',f))
打印号码
如果数字[0]<100:
移动(f,“dir/”+f)
现在的问题是:如果这样,如何在更少的代码中完成,例如在一行中(最多80个字符)


我更喜欢在
bash
shell中使用的解决方案。

除非我误解了你的意思:

mv foo[0-9][0-9].bar* /wherever/you/like
将捕获2位数字

对于任何一种情况,您都可以:

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


你有没有试过自己在bash中解决这个问题?如果是这样的话,你在哪里被卡住了?@TomFenech在
bash
部分,真的。我的问题更多地基于对其他解决方案的兴趣,因为我知道我花了大约10分钟编写的代码在大小上远远不是最佳的。我现在确实看到了这个缺陷,它不是一个真正的问题,也不是一个问题,但是我仍然感兴趣。你可以尝试使用
{0..99}
来捕捉所有的一位数和两位数,而不是
[0-9][0-9]
。哦,是的,这只捕捉两位数,而不是1@hgazibara虽然有效,如果找不到该范围内的某些数字,它也会给出错误…@TheJustist然后您可以使
mv
以静默方式失败,或者使用管道首先查找与模式匹配的所有文件,然后仅移动找到的文件。放置更全面的选项。
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