하나의 파일을 제외한 모든 파일 / 디렉토리 제거 file.txt를 제외한 모든 파일을

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

원하지 않는 파일을 개별적으로 제거하기에는 파일이 너무 많으며 이름이 너무 다양하여 *를 사용하여이 파일을 제외한 모든 파일을 제거 할 수 없습니다.

누군가 사용 제안

rm !(file.txt)

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

Badly placed ()'s

내 OS는 Scientific Linux 6입니다.

어떤 아이디어?



답변

POSIXly :

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

를 제외한 모든 일반 파일 (숨겨진 파일을 포함하여 재귀 적으로)을 제거합니다 file.txt. 디렉토리를 제거하려면, 변경 -type f-type d와 추가 -r로 옵션을 rm.

에서 bash사용하려면 rm -- !(file.txt)다음을 수행해야 extglob 가능 :

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

(또는 전화 bash -O extglob)

참고 extglob에서만 작동 bash및 Korn 쉘의 가족. 사용 rm -- !(file.txt)하면 Argument list too long오류 가 발생할 수 있습니다 .

에서 확장 글로브가 활성화 패턴을 무효화 zsh하는 ^데 사용할 수 있습니다 .

$ setopt extendedglob
$ rm -- ^file.txt

또는와 같은 구문을 사용 ksh하고 bash옵션 ksh_globno_bare_glob_qual사용 가능.


답변

다른 방향으로 다른 방향 (파일 이름에 공백이없는 경우)

ls | grep -v file.txt | xargs rm

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

ls | grep -v file.txt | parallel rm

부터 man grep:

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


답변

사본을 유지 보수하고 모든 항목을 삭제하며 사본을 복원하십시오.

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

한 줄로 :

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

그러나 여기에는 문자열을 지원하는 쉘이 필요합니다.


답변

당신은 모두 이것을 너무 생각하고 있습니다.

cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/

끝난.

실제로 더 쉽게 편집하십시오 .

cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/


답변

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

shopt -s extglob
rm !(file.txt)

또한 가상 머신에 데비안 32 비트가 설치되어 있습니다. 위의 기능은 작동하지 않지만 다음은 작동합니다.

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


답변

rm !("file.txt")대신에 사용rm !(file.txt)


답변

다른 답변을 제공하기 위해 rm폴더를 삭제하지 않는 기본 동작을 사용할 수 있습니다 .

mkdir tmp && mv file.txt tmp  # create tmp dir and move files there
rm                            # delete all other files
mv tmp/* . && rm -rf tmp      # move all files back and delete tmp dir