Bash 外壳印刷刚刚好的一部分后。(DOT)
我需要找到目录中所有文件的扩展名(若有两个相同的扩展名,那个么只有一个)。我已经有了。但是我的脚本的输出是Bash 外壳印刷刚刚好的一部分后。(DOT),bash,shell,variables,Bash,Shell,Variables,我需要找到目录中所有文件的扩展名(若有两个相同的扩展名,那个么只有一个)。我已经有了。但是我的脚本的输出是 test.txt test2.txt hello.iso bay.fds hellllu.pdf 我用的是grep-e-e'.'并且它只是高亮显示点 我只需要这些扩展提供一个变量,比如txt、iso、fds、pdf 有人能帮忙吗?我已经有过一次了,但我在阵列上有过。今天我发现它也必须在dash上工作。也可以用查找完成,但我认为这更容易 for f in *.*; do echo "${f
test.txt
test2.txt
hello.iso
bay.fds
hellllu.pdf
我用的是grep-e-e'.'并且它只是高亮显示点
我只需要这些扩展提供一个变量,比如txt、iso、fds、pdf
有人能帮忙吗?我已经有过一次了,但我在阵列上有过。今天我发现它也必须在dash上工作。也可以用
查找完成,但我认为这更容易
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 "*.*" | ...
也可以使用查找完成,但我认为这更容易
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 "*.*" | ...
您可以使用find
和awk
来获得所有唯一的扩展:
find . -type f -name '?*.?*' -print0 |
awk -F. -v RS='\0' '!seen[$NF]++{print $NF}'
您可以使用find
和awk
来获得所有唯一的扩展:
find . -type f -name '?*.?*' -print0 |
awk -F. -v RS='\0' '!seen[$NF]++{print $NF}'
这是可行的,但只适用于当前目录:/如果我有in变量,例如保存了输出的文件(在上一篇文章的代码链接中),我如何将其与循环中的文件组合?(这是一个函数。我在“main”中调用它,就像printf“Extensions:%s”“函数的输出”ls-1
在这里是无用的,因为printf'%s\n'*.*.
也可以完成这项工作。不过,这将与包含换行符的文件名相冲突。还有一件事。当我调用dir例如something.dirsomething时,脚本将采用.dirsomething类似于文件扩展名。我能用它做什么呢?感谢您的响应在当前目录中:/如果我在变量中保存了该输出的示例文件(在上一篇文章的代码链接中),那么我如何将其与循环中的该输出进行组合?(这都在一个函数中。我在“main”中调用它,就像printf“Extensions:%s”“output of function”ls-1
在这里是无用的,因为printf'%s\n'*.*.
也可以完成这项工作。不过,这将与包含换行符的文件名相冲突。还有一件事。当我调用dir例如something.dirsomething时,脚本将采用.dirsomething类似于文件扩展名。我能用它做什么呢?谢谢您的响应hello。这段代码可以工作。B但有一个例外。当我在目录(和子目录)中有文件时,例如text.txt some.iso hw.pdf.hellou(其中hellou是隐藏文件),我如何才能“将该例外从列表中删除?”所以exteption将仅为.txt、.iso和.pdf?您好。此代码有效。但有一个例外。当我在目录(和子目录)中有文件时例如text.txt some.iso hw.pdf.hellou(其中hellou是隐藏文件),我如何才能“将该异常从列表中删除?”因此exteption将仅为.txt、.iso和.pdf?