Shell 脚本检查是否存在一个或多个具有特定扩展名的文件?

Shell 脚本检查是否存在一个或多个具有特定扩展名的文件?

我想编写一个脚本来查找具有特定扩展名的文件。我已经做了这么多:

#!/bin/bash
file="/home/Savio/Dsktop/check/*.csv"
file1="/home/Savio/check/*.txt"
if [[ -f "$file" && -f "$file1" ]];
then
    echo " found."
else
    echo "not found."
fi

其中check文件夹包含子文件夹。如果有什么不对的地方请指正

答案1

如果你不想递归,你可以这样做

export DIR=/home/Savio/Dsktop/check
if ls ${DIR}/*.txt &>/dev/null && ls ${DIR}/*.csv &>/dev/null
then
    echo "Found."
else
    echo "Not found."
fi

或者,在perl

perl -e '
    $DIR="/home/Savio/Dsktop/check";
    @a= glob "${DIR}/*.txt";
    @b= glob "${DIR}/*.csv"; 
    print  @a && @b ? "Found.\n" : "Not found.\n"
' 

如果你想要递归,其他答案中提出的解决方案将起作用。您可以通过find在找到第一个匹配项后停止来使其运行得更快:

export DIR=/home/Savio/Dsktop/check
CSV=$(find "$DIR" -name *.csv|head -n1)
TXT=$(find "$DIR" -name *.txt|head -n1)
[ ! -z "$CSV" ] && [ ! -z "$TXT" ] && echo Found || echo Not found

参考

答案2

bash脚本检查csv文件是否存在并for循环所有文件是否存在

#!/bin/bash
# count variable to check if csv files exists in current directory
count_file=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count_file != 0 ]
then 
  for file in *.csv; do
    echo ${file##*/}
  done
fi 

答案3

in 中的通配符file1永远不会扩展,因为它始终用引号引起来。

在 bash 中,一种方法是设置nullglob选项这样,与任何文件都不匹配的通配符就会扩展为空列表。

#!/bin/bash
shopt -s nullglob
csv_files=(/home/Savio/Dsktop/check/*.csv)
txt_files=(/home/Savio/check/*.txt)
if ((${#csv_files[@]} && ${#txt_files[@]}))
then
  echo " found."
else
  echo "not found."
fi

如果您还想匹配点文件,请设置该dotglob选项。

仅使用 POSIX shell,如果没有匹配项,您需要处理保持不变的模式。

matches_exist () {
  [ $# -gt 1 ] || [ -e "$1" ]
}
if matches_exist /home/Savio/Dsktop/check/*.csv &&
   matches_exist /home/Savio/check/*.txt; then
  echo " found."
else
  echo "not found."
fi

[[ -f file ]]请注意,当您检查文件是否存在时,它会查找文件,无论其类型如何(常规、目录、符号链接、设备、管道...)是一个常规的文件或仅到常规文件的符号链接(不包括目录、设备...)。

答案4

请注意,if [[ -f "$file" ]]如果$file包含多个文件名,该操作将会失败——当您使用通配符选择文件时,很可能会发生这种情况。

您应该检查特定文件名(不带任何通配符)或使用 Petey T 的方法并检查找到的文件数是否find大于 0:

csv=$(find /home/Savio/Dsktop/check -type f -name "*.csv")
txt=$(find /home/Savio/check/ -type f -name "*.txt")
if [[ ( -n $csv ) -a ( -n $txt ) ]]
then
    echo "found"
else
    echo "not found"
fi

相关内容