如何用bash来判断特定扩展名的文件是否存在于目录中?
像
这样的东西if [ -e *.flac ]; then
echo true;
fi
答案 0 :(得分:73)
#!/bin/bash
count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo true
fi
答案 1 :(得分:15)
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
答案 2 :(得分:12)
这使用ls(1),如果不存在flac文件,则ls报告错误并退出脚本;此外,脚本继续并且可以处理文件
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
答案 3 :(得分:7)
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
答案 4 :(得分:3)
#!/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
答案 5 :(得分:3)
顶级解决方案(if [ -e *.flac ];)
对我不起作用,给出:[: too many arguments
if ls *.flac >/dev/null 2>&1;
然后就可以了。
答案 6 :(得分:2)
你需要保持谨慎,将你扔进if
陈述的标志,以及它与你想要的结果有什么关系。
如果您想检查仅常规文件而不是其他类型的文件系统条目,那么您需要将代码框架更改为:
if [ -f file ]; then
echo true;
fi
-f
的使用将if
限制为常规文件,而-e
更具扩展性,并且将匹配所有类型的文件系统条目。目前还有其他选项,例如-d
目录等。有关好的列表,请参阅http://tldp.org/LDP/abs/html/fto.html。
正如@msw所指出的那样,test
(即[
)如果您尝试为其提供多个参数,则会阻塞。如果*.flac
的glob返回多个文件,则可能会发生这种情况。在这种情况下,尝试将if
测试包装在一个循环中,如:
for file in ./*.pdf
do
if [ -f "${file}" ]; then
echo 'true';
break
fi
done
通过这种方式,您可以在所需的文件扩展名的第一个实例上break
,并可以继续使用其余的脚本。
答案 7 :(得分:2)
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
答案 8 :(得分: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
设置)。
答案 9 :(得分:1)
这是一个不使用外部命令(即没有item.type === type_A
)的解决方案,而是一个shell函数。在bash中测试:
<container-element [ngSwitch]="switch_expression">
<some-element *ngSwitchCase="match_expression_1">...</some-element>
<some-element *ngSwitchCase="match_expression_2">...</some-element>
<some-other-element *ngSwitchCase="match_expression_3">...</some-other-element>
<ng-container *ngSwitchCase="match_expression_3">
<!-- use a ng-container to group multiple root nodes -->
<inner-element></inner-element>
<inner-other-element></inner-other-element>
</ng-container>
<some-element *ngSwitchDefault>...</some-element>
</container-element>
函数ls
使用shopt -s nullglob
function have_any() {
[ $# -gt 0 ]
}
if have_any ./*.flac; then
echo true
fi
来计算其参数,然后have_any
测试是否至少有一个参数。在调用$#
时使用[ $# -gt 0 ]
而不是./*.flac
是为了避免由名称为*.flac
的文件引起的问题。
答案 10 :(得分:1)
您可以使用-f检查是否存在特定类型的文件:
#!/bin/bash
if [ -f *.flac ] ; then
echo true
fi
答案 11 :(得分:0)
使用zsh完成:
if [[ -n *.flac(#qN) ]]; then
echo true
fi
这在zsh手册的Conditional Expressions部分的末尾列出。由于[[
禁用文件名匹配,因此我们需要在字符串的末尾使用(#q)
强制生成文件名,然后使用N
标志(NULL_GLOB
选项)强制生成如果没有匹配项,则字符串为空。
答案 12 :(得分:0)
这是一个相当简单的解决方案:
if [ "$(ls -A | grep -i \\.flac\$)" ]; then echo true; fi
如您所见,这只是一行代码,但是效果很好。它应该与bash和dashix等posix兼容外壳一起使用。它也不区分大小写,并且不关心存在什么类型的文件(常规文件,符号链接,目录等),如果您有符号链接或其他内容,这可能会很有用。
答案 13 :(得分:0)
我尝试过:
if [ -f *.html ]; then
echo "html files exist"
else
echo "html files dont exist"
fi
我使用这段代码对其他文件没有任何问题,但是对于html文件,我收到了error:
[: too many arguments
然后我尝试了@JeremyWeir的计数解决方案,该方法对我有用。
请记住,如果要循环执行此操作,则必须重置计数:
count=$((0))
答案 14 :(得分:0)
这应该适用于任何类似承载的外壳:
if [ "$(find . -maxdepth 1 -type f | grep -i '.*\.flac$')" ]; then
echo true
fi
这也适用于 GNU find
,但 IDK 如果它与 find
的其他实现兼容:
if [ "$(find . -maxdepth 1 -type f -iname \*.flac)" ]; then
echo true
fi