하나의 파일을 제외한 모든 파일/디렉토리 삭제

하나의 파일을 제외한 모든 파일/디렉토리 삭제

많은 파일이 포함된 디렉토리가 있습니다. file.txt를 제외한 모든 파일을 삭제하고 싶습니다. 어떻게 해야 하나요?

불필요한 파일을 개별적으로 삭제하기엔 파일이 너무 많고, 이 파일만 빼고 모두 삭제하려면 *를 사용하는 등 다양한 이름이 있습니다.

누군가가 사용을 제안했습니다.

rm !(file.txt)

그러나 이것은 작동하지 않습니다. 다음을 반환합니다.

Badly placed ()'s 

내 운영 체제는 Scientific Linux 6입니다.

어떤 아이디어가 있나요?

답변1

POSIX적으로:

find . ! -name 'file.txt' -type f -exec rm -f {} +

이름이 지정된 디렉터리를 제외한 모든 일반 파일(숨겨진 파일 포함)을 반복적으로 제거합니다 file.txt. 디렉터리를 제거하려면 -type f로 변경하고 옵션을 -type d추가합니다 .-rrm

에서 을 bash사용하려면 rm -- !(file.txt)다음을 수행해야 합니다.extglob 활성화:

$ shopt -s extglob 
$ rm -- !(file.txt)

(또는 전화 bash -O extglob)

Korn 쉘 시리즈 extglob에만 사용할 수 있습니다 . bash사용시 오류가 rm -- !(file.txt)발생할 수 있습니다 Argument list too long.

다음을 사용하여 패턴을 부정 zsh할 수 있습니다 .^글로벌 확장할 수 있게 하다:

$ setopt extendedglob
$ rm -- ^file.txt

ksh또는 bash및 옵션과 동일한 구문을 사용 ksh_glob하고 no_bare_glob_qual활성화합니다.

답변2

다른 방향으로 다시 시도해 보세요(파일 이름에 공백이 없는 경우).

ls | grep -xv "file.txt" | xargs rm

또는 (파일 이름에 공백이 있어도 작동함)

ls | grep -xv "file.txt" | parallel rm

에서 man grep:

 -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX)

 
 -x, --line-regexp
          Select  only  those  matches  that exactly match the
          whole line.  For a regular expression pattern,  this
          is   like   parenthesizing   the  pattern  and  then
          surrounding it with ^ and $.

그렇지 않은 경우에는 -x보관하겠습니다 my-file.txt.

답변3

사본 유지, 모든 콘텐츠 삭제, 사본 복원:

{   rm -rf *
    tar -x
} <<TAR
$(tar -c $one_file)
TAR

한 줄:

{ rm -rf *; tar -x; } <<< $(tar -c $one_file)

하지만 여기에 있는 문자열을 지원하는 쉘이 필요합니다.

답변4

내 Scientific Linux 6 OS에서는 다음과 같이 작동합니다.

shopt -s extglob
rm !(file.txt)

또한 가상 머신에 Debian 32비트를 설치했습니다. 위의 방법은 작동하지 않지만 다음 방법은 작동합니다.

find . -type f ! -name 'file.txt' -delete

관련 정보