特定のフォルダーのファイル(この場合は、そのフォルダーにあるすべての.csvファイル)を削除する非常に単純なシェルをコーディングしています。
コードは次のようになります。
#!/bin/bash
# Used to clean folder
MinVal=0
Files=$(ls -1 *.csv | wc -l)
if [ $Files -gt $MinVal ];then
rm *.csv
echo -e "\e[31;43m***** DONE *****\e[0m"
else
echo -e "\e[31;43mThere is no valid file to delete, please check\e[0m"
fi
シェルスクリプトは期待どおりに機能しますが、シェルを実行し、フォルダーに.csvファイルがない場合、ターミナルは次のように表示します。
ls: cannot access *.csv: No such file or directory
もちろん、else
メッセージも表示されます。
There is no valid file to delete, please check
ls: cannot access *.csv: No such file or directory
を回避し、else
エラー処理に直接アクセスする方法はありますか?
ご挨拶。
これは、*.csv
は、シェルによって逐語的にls
に渡されます。これは、デフォルトのPOSIX動作です。これを回避したい場合は、nullglob
を使用して、入力された逐語的な文字列を返す代わりに、何も返さないグロブが何も返さないようにする必要があります。ただし、ファイルが提供されていない場合はls
の動作が異なるため、これには問題があります。
代わりにこれを試してください。これには、ファイル名に改行が埋め込まれている場合のバグを回避できるという利点があります。
shopt -s nullglob
filenames=( *.csv ) # put all files in an array
files="${#filenames[@]}" # get number of files
ls
からの警告メッセージを抑制するだけの場合、最も簡単な方法は、stderr
を_/dev/null
_にリダイレクトすることです。例:
_Files=$(2>/dev/null ls -1 *.csv | wc -l)
_
stderr
をリダイレクトすると、このコマンドに起因するallエラーが抑制されることに注意してください。これには、_*.csv
_ディレクトリ内のファイル。
ファイルをカウントするためのより良い解決策は、find
の代わりにls
を使用することです。例:
_find . -maxdepth 1 -name "*.csv" | wc -l
_
実際、find
を使用して削除も実行することをお勧めします。
_find . -maxdepth 1 -name "*.csv" -delete
_
また、rm
で_-r
_フラグを使用していることにも気付きました。これは、ls
を使用してフラット検索を実行した後、 rm
。
率直に言って、このタスクのスクリプトを書くことがあまり意味があるかどうかはわかりません。このスクリプトは、コマンドを直接実行するよりもどのような利点がありますか?言い換えれば、これの何が問題になっていますか?
_# Check for files
ls *.csv
# Delete the files
rm *.csv
_
これらのコマンドを実行するよりもスクリプトを実行する方が良いのはなぜですか?オーバーヘッドを追加して、あるエラーメッセージを別のエラーメッセージに置き換えているようです。