複数のファイルが存在するかどうかを確認するにはどうすればよいでしょうか?

複数のファイルが存在するかどうかを確認するにはどうすればよいでしょうか?

ファイル を検索し/tmp/bbsnode1、そのファイルが存在する場合はそれを削除するシェル スクリプトがあります。複数のファイル ( /tmp/bbsnode2/tmp/bbsnode3/tmp/bbsnode4) が存在する場合は、それらすべてを削除したいのです。ただし、すべてが存在する場合にのみ削除してください。

これまでのところ、次のものがあります:

if [ -f /tmp/bbsnode1 ]
then
/usr/bin/rm /tmp/bbsnode1
fi

答え1

私はシェルを使うだろう関数スクリプトではなく、次のようになります。

rm-all-or-none() {
  for f; do
    [ -f "$f" ] ||
      { printf '%s is not an existing file, no files removed\n' "$f" >&2
        return 1;}
  done
  rm -fv -- "$@"
}

それから、グロブではなく中括弧展開を使って呼び出します。グロブは、次のファイルにのみ展開されます。存在するただし、この場合はファイルを指定して、次の場合にのみ削除します。全て存在するもの:

rm-all-or-none /tmp/bbsnode{1..4}

より長い同等バージョン:

rm-all-or-none() {
  for f in "$@"; do
    if [ -f "$f" ]; then
      :
    else
      printf '%s is not an existing file, no files removed\n' "$f" >&2
      return 1
    fi
  done
  rm -fv -- "$@"
}

以下も参照:

答え2

任意のコマンドを使用して、lsファイルをチェックし、1行で削除することができます。

ls /tmp/bbsnode{1,2,3,4} &>/dev/null && rm /tmp/bbsnode{1,2,3,4}

一般的に、他のユーザーが同じ名前の競合するファイルを作成する可能性があるため、/tmp でこのようなことを行うのは安全ではないことに注意してください。

簡単な説明:

ファイルの 1 つが存在しない場合は、 の戻り値はls0 以外になります。 は{1,2,3,4}中括弧の展開です。これは各数値の文字列に展開されます。したがって、 は/tmp/bbsnode{1,2,3,4}と同じです/tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4&&は、前のコマンドの戻り値が 0 の場合にのみ次のコマンドを実行します。したがって、ここではrmは 4 つのファイルがすべて存在する場合にのみ実行されます。最後に、&> /dev/nullは の出力を抑制しますls(と の&>両方をリダイレクトしたため、はそれを削除します)。stdoutstderr/dev/null

以下は、シェル組み込み関数のみを使用した別のソリューションです。これは、他の人が回答したものと似ていますが、追加の関数やスクリプトはありません。

set -- /tmp/bbsnode{1,2,3,4}
(for f; do test -f "$f" || exit; done) && rm -- "$@"

答え3

この特定のケースでは、次の操作を実行できます。

set -- file[1-4]
[[ $# -eq 4 ]] && rm -f -- "$@"

これは、、、または1 のsetいずれかに一致するファイル名への引数リストであり、引数の数が 4 の場合、つまりすべてのファイルが存在する場合にのみ、それらのファイルを します 。file1file2file3file4rm


1: 簡単にするために、file代わりに/tmp/bbsnode

答え4

このスクリプトを使うと、removing_group

#!/usr/bin/bash

function check {
    while (( "$#" )) ; do
        if [ -f "$1" ] ; then
            # echo "The file $1" ;
            shift ;
        else
            # echo "The's no file $1";
            return 1
        fi
    done
    return 0
}

if check $@; then
    while (( "$#" )) ; do
        # echo "Remove $1" ;
        rm "$1" ;
        shift ;
    done
fi

関数checkは、引数のすべてが通常のファイルであるかどうかをチェックします。次のファイルが存在しない場合は、関数は戻り1、何も起こりません。すべてのファイルが存在する場合は、戻り値は0プロセスとなりif check $@、ファイルを1つずつ削除します。チェックおよび削除するファイルは、コマンドラインでパラメータとして記述されます。たとえば、

./removing_group /tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4

または

./removing_group /tmp/bbsnode{1,2,3,4}

関連情報