检查目录中是否存在某种文件类型/扩展名

时间:2010-10-04 15:37:56

标签: linux bash shell

如何用bash来判断特定扩展名的文件是否存在于目录中?

这样的东西
if [ -e *.flac ]; then 
echo true; 
fi 

15 个答案:

答案 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