複数のファイルが存在するかどうかを確認するには?

複数のファイルが存在するかどうかを確認するには?

/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 -- "$@"
}

次に、globの代わりに中かっこ拡張を使用して呼び出します。 Globは次のファイルにのみ拡張されます。存在するただし、この場合は、次の場合にのみファイルを指定して削除しようとします。みんなその中には以下が含まれます:

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つが存在しない場合、戻り値lsは0ではありません。中かっこ拡張です{1,2,3,4}。各数値の文字列に展開されます。したがって、/tmp/bbsnode{1,2,3,4}と同じです/tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4&&次のコマンドは、前のコマンドの戻り値が0の場合にのみ実行されるため、ここではrm4つのファイルがすべて存在する場合にのみ実行されます。最後に、&> /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何も起こりません。すべてのファイルが存在する場合に返されるのは、ファイルを1つずつ削除する0プロセスです。if check $@スキャンと削除のためのファイルは、コマンドラインで引数として記述されます。

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

または

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

関連情報