0

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

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 循环中使用最终结果,这将为每种类型创建一个子目录,其中包含按日期列出的所有其他文件。

4

5 回答 5

2

一种方法是说:

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

为了避免解析 ls output,你可以说:

find . -mindepth 1 -maxdepth 1 -type f -printf "%P\n" | sed 's/-.*//g' | sort -u
于 2013-10-14T14:38:28.250 回答
2

纯 BASH 方式:

s='foo-2013-09-01.gz'
echo "${s%%-*}"
foo
于 2013-10-14T14:43:25.330 回答
2

假设您有文件列表:

... | awk -F'-' '!x[$0=$1]++' | xargs mkdir
于 2013-10-14T14:47:29.257 回答
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
于 2013-10-14T14:38:24.687 回答
0

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

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

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

于 2013-10-14T20:54:40.820 回答