
파일을 찾는 쉘 스크립트가 있는데, /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 대신 중괄호 확장을 사용하여 호출합니다. Globs는 다음과 같은 파일로만 확장됩니다.존재하다하지만 이 경우에는 파일을 지정하고 다음과 같은 경우에만 파일을 제거하려고 합니다.모두그 중 존재합니다:
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이 아닙니다. is {1,2,3,4}
중괄호 확장: 각 숫자에 대한 문자열로 확장되므로 /tmp/bbsnode{1,2,3,4}
와 동일합니다 /tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4
. &&
이전 명령의 반환 값이 0인 경우에만 다음 명령을 실행하므로 여기서는 4 rm
개의 파일이 모두 존재하는 경우에만 실행됩니다. 마지막으로 는 &> /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 $@
명령줄에서 매개변수로 설명되는 확인 및 제거용 파일은 다음과 같습니다.
./removing_group /tmp/bbsnode1 /tmp/bbsnode2 /tmp/bbsnode3 /tmp/bbsnode4
또는
./removing_group /tmp/bbsnode{1,2,3,4}