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