/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
하고 한 줄로 삭제할 수 있습니다
ls /tmp/bbsnode{1,2,3,4} &>/dev/null && rm /tmp/bbsnode{1,2,3,4}
다른 사용자가 동일한 이름으로 충돌하는 파일을 생성할 수 있으므로 /tmp에서 이러한 작업을 수행하는 것은 일반적으로 안전하지 않습니다.
간단한 설명:
파일 중 하나가 존재하지 않으면 반환 값 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 -- "$@"
이는 , 또는 1set
중 하나와 일치하는 파일 이름에 대한 인수 목록 이며 인수 수가 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
process 입니다 . if check $@
검사 및 삭제를 위한 파일은 명령줄에서 인수로 설명됩니다.
./removing_group /tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4
또는
./removing_group /tmp/bbsnode{1,2,3,4}