检查目录中是否存在某个文件types/扩展名

你将如何去告诉特定扩展名的文件是否存在于一个目录中,用bash?

就像是

if [ -e *.flac ]; then echo true; fi 

 #!/bin/bash count=`ls -1 *.flac 2>/dev/null | wc -l` if [ $count != 0 ] then echo true fi 
 #/bin/bash myarray=(`find ./ -maxdepth 1 -name "*.py"`) if [ ${#myarray[@]} -gt 0 ]; then echo true else echo false fi 

这使用ls(1),如果没有flac文件存在,ls报告错误并且脚本退出; 另外脚本继续,文件可能被处理

 #! /bin/sh ls *.flac >/dev/null || exit ## Do something with flac files here 
 shopt -s nullglob if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ] then echo true fi 
 #!/bin/bash files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l) if [ "$files" != "0" ] then echo "Some files exists." else echo "No files with that extension." fi 

你需要很好地把你的言论放在哪个标志上,以及它与你想要的结果有什么关系。

如果您只想检查常规文件而不检查其他types的文件系统条目,那么您需要将代码框架更改为:

 if [ -f file ]; then echo true; fi 

使用-fif限制为常规文件,而-e则更为宽泛,并且将匹配所有types的文件系统条目。 当然还有其他选项,例如-d用于目录等。请参阅http://tldp.org/LDP/abs/html/fto.html以获得更好的列表。

正如@msw所指出的那样,如果你尝试给它多个参数, test (ie [ )将会窒息。 如果*.flac的glob返回多个文件,则可能会发生这种情况。 在这种情况下,尝试包装你的iftesting在一个循环,如:

 for file in ./*.pdf do if [ -f "${file}" ]; then echo 'true'; break fi done 

通过这种方式,您可以打开所需的文件扩展名的第一个实例,并可以继续执行脚本的其余部分。

  shopt -s nullglob set -- $(echo *.ext) if [ "${#}" -gt 0 ];then echo "got file" fi 

最高的解决scheme(if [ -e *.flac ];)不适合我,给: [: too many arguments

if ls *.flac >/dev/null 2>&1; 那么它会工作。

只有bash:

 any_with_ext () ( ext="$1" any=false shopt -s nullglob for f in *."$ext"; do any=true break done echo $any ) if $( any_with_ext flac ); then echo "have some flac" else echo "dir is flac-free" fi 

我使用圆括号而不是大括号来确保使用子shell(不想破坏当前的nullglob设置)。

这里是一个不使用外部命令(即不使用ls )的解决scheme,而是一个shell函数。 testing在bash中:

 shopt -s nullglob function have_any() { [ $# -gt 0 ] } if have_any ./*.flac; then echo true fi 

函数have_any使用$#来计算它的参数,然后[ $# -gt 0 ]testing是否至less有一个参数。 在调用have_any使用./*.flac而不是*.flac ,是为了避免名称如have_any的文件引起的问题。