많은 파일이 포함된 디렉토리가 있습니다. 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
추가합니다 .-r
rm
에서 을 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