web-dev-qa-db-ja.com

特定の拡張子を持つ1つ以上のファイルの存在を確認するシェルスクリプト?

特定の拡張子を持つファイルを見つけるためのスクリプトを記述したいと思います。

#!/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フォルダーにはサブフォルダーが含まれます。何か問題がある場合は修正してください

5
Savio Mathew

再帰が必要ない場合は、

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"
' 

do再帰が必要な場合は、他の回答で提案されている解決策が機能します。最初に一致した後に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
Joseph R.

findはおそらくここでうまく機能します。

csv=$(find /home/Savio/Dsktop/check -type f -name "*.csv")
txt=$(find /home/Savio/check/ -type f -name "*.txt")

あなたが持っているものはサブディレクトリに再帰しません。

1
ptierno

を注意 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
1
n.st

csvファイルが存在するかどうかを確認し、forループのすべてが存在するbashスクリプト

#!/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 
0
Piyush Sharma