【问题标题】:How to derive output file names from sequential input files?如何从顺序输入文件中导出输出文件名?
【发布时间】:2015-04-18 16:19:59
【问题描述】:

我为一个程序获取了一堆文件如下:

/work/xiaofenglu/science/myten.*.dump.gz

现在,我需要提取字符串myten.* 作为顺序输出文件的基本名称。 我使用以下命令来处理这个问题:

for inputfile in *.dump.gz
do
   base_name='basename ${inputfile} .dump.gz'
done

但是,它不起作用。

【问题讨论】:

    标签: linux bash unix filenames


    【解决方案1】:

    使用parameter expansions:

    #!/bin/bash
    
    shopt -s nullglob
    
    for f in /work/xiaofenglu/science/myten.*.dump.gz; do
        base_name=${f%.dump.gz} # removes trailing .dump.gz
        base_name=${base_name##*/} # removes everything up to last / found
        printf 'Base name is: %s\n' "$base_name"
    done
    

    您的命令不起作用,因为您甚至没有调用命令basename。您只是将字符串 base_name 定义为 逐字字符串

    basename ${inputfile} .dump.gz
    

    因为单引号。也许你在某个地方看到了这个命令:

    base_name=`basename ${inputfile} .dump.gz`
    

    并且您将反引号 ` 与单引号 ' 混淆了。使用反引号而不是单引号,该命令有效。但最好使用 $(...) 构造而不是反引号:

    base_name=$(basename "$inputfile" .dump.gz)
    

    称为Command Substitution

    但我想说的是,调用外部进程 basename 来执行 Bash 自己可以很好地完成的事情是没有用的。

    【讨论】:

    • 我不知道如何在帖子中添加一个反引号......甚至可能吗?
    • 单反引号:`是的,只需使用单反斜杠转义即可。
    • @shellter:谢谢……但它不是“代码”格式……它已经聊胜于无了:)
    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多