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