여러 파일이 존재하는지 확인하는 방법은 무엇입니까?

여러 파일이 존재하는지 확인하는 방법은 무엇입니까?

/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인 경우에만 실행되므로 여기서는 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 -- "$@"

이는 , 또는 1set 중 하나와 일치하는 파일 이름에 대한 인수 목록 이며 인수 수가 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아무 일도 일어나지 않습니다. 모든 파일이 존재하는 경우 반환되는 것은 파일을 하나씩 삭제하는 0process 입니다 . if check $@검사 및 삭제를 위한 파일은 명령줄에서 인수로 설명됩니다.

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

또는

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

관련 정보