SHELL打印后恰到好处。 (点)

时间:2016-03-25 16:41:03

标签: bash shell variables

我需要找到目录中所有文件的扩展名(如果有2个相同的扩展名,那么它只是一个)。这东西我已经有了。但我的脚本输出就像

test.txt
test2.txt
hello.iso
bay.fds
hellllu.pdf

我正在使用grep -e -e'。'它只是突出显示DOT 我只需要这些扩展就可以输入一个变量,如txt,iso,fds,pdf

有没有人可以提供帮助?我已经有过一次,但是我已经在阵列上了。今天我发现它也必须在破折号上工作。

2 个答案:

答案 0 :(得分:0)

也可以使用find完成,但我认为这更容易

for f in *.*; do echo "${f##*.}"; done | sort -u

如果要分配以逗号分隔的唯一扩展名列表,可以按照

进行操作
ext=$(for f in *.*; do echo "${f##*.}"; done | sort -u | paste -sd,)

echo $ext

csv,pdf,txt

ls

ls -1 *.* | rev | cut -d. -f1 | rev | sort -u | paste -sd,
假如扩展名在最后一个点之后,如果文件名中有多个点,则需要

rev / rev。对于任何其他目录,只需在所有脚本中将部件*.*更改为dirpath/*.*

我不确定我理解你的评论。如果不分配给变量,默认情况下它将打印到输出。如果要将目录名称作为变量传递给脚本,请将代码放入脚本文件中并将dirpath替换为$ 1,假设这将是脚本的第一个参数

#!/bin/bash
# print unique extension in the directory passed as an argument, i.e.

ls -1 "$1"/*.* ...

如果您的子目录包含以上扩展名,则脚本也包含它们,仅限于使用

替换ls ..的文件类型
find . -maxdepth 1 -type f -name "*.*" | ...

答案 1 :(得分:0)

您可以findawk一起使用以获取所有独特的扩展程序:

find . -type f -name '?*.?*' -print0 | 
awk -F. -v RS='\0' '!seen[$NF]++{print $NF}'