我们在一个目录中保存了数千个文件。那里的共同模式是约会。例如:
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循环中使用最终结果,它将为每个类型创建一个子目录,该子目录按日期包含所有其他文件。
答案 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
截断文件名,然后使用保留空间检查唯一键。 如果密钥已存在,则删除该行,否则将其添加到保留空间,然后打印唯一密钥。