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

olqngx59  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(500)

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

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.filext格式)。我们打算在for循环中使用最终结果,该循环将为每个类型创建一个子目录,其中按日期包含所有其他文件。

798qvoo8

798qvoo81#

纯bash方式:

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

nwwlzxa72#

这可能适用于您(gnu-sed):

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

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

ztmd8pv5

ztmd8pv53#

假设您有文件列表:

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

tquggr8v4#

一种方法是:

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

为了避免解析ls输出,可以说:

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

ego6inou5#

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

相关问题