我需要找到目录中所有文件的扩展名(如果有2个相同的扩展名,那么它只是一个)。这东西我已经有了。但我的脚本输出就像
test.txt
test2.txt
hello.iso
bay.fds
hellllu.pdf
我正在使用grep -e -e'。'它只是突出显示DOT 我只需要这些扩展就可以输入一个变量,如txt,iso,fds,pdf
有没有人可以提供帮助?我已经有过一次,但是我已经在阵列上了。今天我发现它也必须在破折号上工作。
答案 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)
您可以find
与awk
一起使用以获取所有独特的扩展程序:
find . -type f -name '?*.?*' -print0 |
awk -F. -v RS='\0' '!seen[$NF]++{print $NF}'