/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の場合にのみ実行されるため、ここでは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
何も起こりません。すべてのファイルが存在する場合に返されるのは、ファイルを1つずつ削除する0
プロセスです。if check $@
スキャンと削除のためのファイルは、コマンドラインで引数として記述されます。
./removing_group /tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4
または
./removing_group /tmp/bbsnode{1,2,3,4}