Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 外壳印刷刚刚好的一部分后。(DOT)_Bash_Shell_Variables - Fatal编程技术网

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?