将文件名提取到第一个破折号

时间:2013-10-14 14:34:17

标签: regex bash for-loop hadoop sed

我们在一个目录中保存了数千个文件。那里的共同模式是约会。例如:

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

我们怎样才能在第一个破折号之前获取唯一文件名列表? E.g。

foo
bar
fu
ba
cat
dog

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

5 个答案:

答案 0 :(得分:2)

一种方法是说:

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

答案 1 :(得分:2)

Pure BASH方式:

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

答案 2 :(得分:2)

假设您有文件列表:

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

答案 3 :(得分:1)

使用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

答案 4 :(得分:0)

这可能适合你(GNU sed):

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

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