ファイルがディレクトリに存在する場合...? [コピー]

ファイルがディレクトリに存在する場合...? [コピー]

ifステートメントを作成しようとしています。

このディレクトリにあるファイルの拡張子が.PDFの場合は次のようにし、そうでない場合は次のようにします。

Bashでこれを行う方法を見つけるのに問題があります。ここで確認しました。https://stackoverflow.com/questions/3856747/check-whether-a-certain-file-type-extension-exists-in-directory

まず、リストされているソリューションが機能しないか、解決策がわからないエラーが発生します。

以下に私のスクリプトが添付されています。以前の質問で作業していたスクリプトを少し修正しました。ファイル拡張子のみ変更

スクリプトは次のとおりです。

#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1 of the homework"
 #Initial prompt used for testing to see if script ran


#shopt allows configuration of the shell -s dotglob allows the script to run on dot-files
shopt -s dotglob

#loop to iterate through each file in Task1 directory and rename them
#loop runs if there is a file type of ".PDF" in the folder Task1, if there isn't displays that there i
sn't a file of that type and terminates 
if [ [ -n $(echo *.PDF) ] ] # what should I put here???  
then
        for file in Task1/*.PDF;
        do

                mv "$file" "${file%.PDF}.pdf"
                echo "$file has been updated"
        done
else
                echo "No files of that type..."
fi
~           

**編集1:**

以下のIpor Sircerの答えに基づいて、スクリプトを次のように変更しました。

#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1 of the homework"
 #Initial prompt used for testing to see if script ran


#shopt allows configuration of the shell -s dotglob allows the script to run on dot-files
shopt -s dotglob

#loop to iterate through each file in Task1 directory and rename them
#loop runs if there is a file type of ".PDF" in the folder Task1, if there isn't displays that there isn't a file of that type and terminates 
if [ ls -1 *.PDF|xargs -l1 bash -c 'mv $0 ${0%.PDF}.pdf' ]
then
        for file in Task1/*.PDF;
        do

                mv "$file" "${file%.PDF}.pdf"
                echo "$file has been updated"
        done
else
                echo "No files of that type..."
fi

次のエラーが発生します。

こんにちは宿題1です

./Shell1.sh: 行 12: [:`]' がありません

mv:計算できません ']':そのファイルまたはディレクトリはありません

この種のファイルはありません...

編集2

Eric Renoufのコメントに基づいて間隔を変更すると、次のスクリプトが提供されます。

#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1 of the homework"
 #Initial prompt used for testing to see if script ran


#shopt allows configuration of the shell -s dotglob allows the script to run on dot-files
shopt -s dotglob

#loop to iterate through each file in Task1 directory and rename them
#loop runs if there is a file type of ".PDF" in the folder Task1, if there isn't displays that there isn't a file of that type and terminates 
if [[ -n $(echo *.PDF) ]]
then
        for file in Task1/*.PDF;
        do

                mv "$file" "${file%.PDF}.pdf"
                echo "$file has been updated"
        done
else
                echo "No files of that type..."
fi

ただし、2回実行すると、次の内容が表示されます。

こんにちは宿題1です

mv: "Task1/*.PDF" を計算できません: 対応するファイルまたはディレクトリがありません

ジョブ1/*.PDFが更新されました。

echoフォルダに.PDFタイプのファイルがないため、他のコンテンツを見ることができないのはなぜですか?

答え1

shopt -s nullglob

set -- Task1/*.PDF

if (( $# > 0 )); then
   printf 'There are %d PDF files in "Task1"\n' "$#"
else
   echo 'There are no PDF files in "Task1"'
fi

set場所パラメータは、サブディレクトリで利用可能な各PDFファイルの名前に設定されます。Task1これは呼び出しスクリプトを使用するのと同じです./script Task1/*.PDF

位置引数の数を保持し、$#0より大きいかどうかをテストします。その場合は、利用可能なPDFファイルの数を報告します。それ以外の場合は何も報告しません。これら 2 つのタスクの代わりに、必要なタスクを実行することを選択できます。

タスクが.PDFそのファイルのサフィックスを小文字に置き換えるものである場合は、まず存在するかどうかを確認する必要はありません。

shopt -s nullglob

for fpath in Task1/*.PDF; do
  mv "$fpath" "${fpath%.PDF}.pdf"
done

シェルオプションを設定すると、パターンに一致するファイルがない場合はin値をnullglob取得できません。*fname

答え2

ls -1 *.PDF|xargs -l1 bash -c 'mv $0 ${0%.PDF}.pdf'

答え3

あなたが使用できる:

[ -e *.PDF ]

変える

[ [ -n $(echo *.PDF) ] ] 

例えば

[ -e *.PDF ] && echo 'yes'

関連情報