【问题标题】:Extract filename up to first dash提取文件名直到第一个破折号
【发布时间】:2013-10-14 14:34:16
【问题描述】:

我们在一个目录中保存了数千个文件。常见的模式是日期。例如:

foo-2013-09-01.gz
bar-2013-09-01.gz
fu-2013-09-02.gz
ba-2013-09-02.gz
cat-2013-09-01.gz
dog-2013-09-02.gz
dog-2013-09-03.gz

我们如何才能在第一个破折号之前获得唯一文件名列表?例如

foo
bar
fu
ba
cat
dog

我们不关心路径名,而只关心第一部分(如果您可以在 type-date.fileext 格式中看到它)。我们打算在 for 循环中使用最终结果,这将为每种类型创建一个子目录,其中包含按日期列出的所有其他文件。

【问题讨论】:

  • 它与 Hadoop 有什么关系?

标签: regex bash for-loop hadoop sed


【解决方案1】:

一种方法是说:

ls -1 | sed 's/-.*//g' | sort -u

avoid parsing ls output,你可以说:

find . -mindepth 1 -maxdepth 1 -type f -printf "%P\n" | sed 's/-.*//g' | sort -u

【讨论】:

    【解决方案2】:

    纯 BASH 方式:

    s='foo-2013-09-01.gz'
    echo "${s%%-*}"
    foo
    

    【讨论】:

      【解决方案3】:

      假设您有文件列表:

      ... | awk -F'-' '!x[$0=$1]++' | xargs mkdir
      

      【讨论】:

        【解决方案4】:

        使用sed 's/-.*//':

        falsetru@ubuntu:/tmp/t$ ls
        ba-2013-09-02.gz   cat-2013-09-01.gz  dog-2013-09-03.gz  fu-2013-09-02.gz
        bar-2013-09-01.gz  dog-2013-09-02.gz  foo-2013-09-01.gz
        falsetru@ubuntu:/tmp/t$ ls | sed 's/-.*//'
        ba
        bar
        cat
        dog
        dog
        foo
        fu
        

        【讨论】:

          【解决方案5】:

          这可能对你有用(GNU sed):

          sed -r 's/-.*//;G;/^([^\n]+)\n.*\<\1\>/d;h;P;d' file
          

          截断文件名,然后使用保留空间检查唯一键。 如果密钥已经存在,则删除该行,否则将其添加到保留空间,然后打印唯一密钥。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-25
            • 1970-01-01
            • 2022-01-22
            • 2011-11-05
            • 2015-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多