检查目录中是否存在某个文件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
使用-f
将if
限制为常规文件,而-e
则更为宽泛,并且将匹配所有types的文件系统条目。 当然还有其他选项,例如-d
用于目录等。请参阅http://tldp.org/LDP/abs/html/fto.html以获得更好的列表。;
正如@msw所指出的那样,如果你尝试给它多个参数, test
(ie [
)将会窒息。 如果*.flac
的glob返回多个文件,则可能会发生这种情况。 在这种情况下,尝试包装你的if
testing在一个循环,如:
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
的文件引起的问题。