를 사용할 때 sudo rm -r
다음을 제외한 모든 파일을 어떻게 삭제할 수 있습니까?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
답변
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
-type f
find를 지정하지 않으면 find는 원하지 않는 디렉토리도 나열합니다.
또는 매우 유용한 조합을 사용하는보다 일반적인 솔루션 find | xargs
:
find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
예를 들어, 현재 디렉토리에서 비 txt 파일을 모두 삭제하십시오.
find . -type f -not -name '*txt' -print0 | xargs -0 rm --
print0
및 -0
삭제되어야하는 파일명 중 어느 하나의 공간이 있으면 조합이 필요하다.
답변
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
extglob (Extended Pattern Matching)은 BASH에서 활성화해야합니다 (활성화되지 않은 경우).
shopt -s extglob
답변
find . | grep -v "excluded files criteria" | xargs rm
현재 디렉토리의 모든 파일을 나열한 다음 기준과 일치하지 않는 모든 파일을 나열하고 (디렉토리 이름과 일치하는지 확인한 후) 제거하십시오.
업데이트 : 편집 내용에 따라 나열된 파일을 제외하고 현재 디렉토리에서 모든 것을 삭제하려면 다음을 사용할 수 있습니다.
mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup
백업 디렉토리를 생성하고 /tmp_backup
(루트 권한을 가지고 있습니까?), 디렉토리에 나열된 파일을 이동하고, 현재 디렉토리의 모든 것을 재귀 적으로 삭제합니다 (당신은 올바른 디렉토리에 있다는 것을 알고 있습니까?) 현재 디렉토리로 돌아가서 /tmp_backup
마지막으로 삭제/tmp_backup
.
루트에서 백업 디렉토리를 선택합니다. 루트에서 모든 항목을 반복적으로 삭제하려고하면 시스템에 큰 문제가 발생하기 때문입니다.
분명히 이것을하는 더 우아한 방법이 있지만, 이것은 매우 간단합니다.
답변
해당 이름을 가진 파일이 디렉토리 트리의 여러 위치에 있고 모든 파일을 보존하려고한다고 가정하십시오.
find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
답변
Bash에서 GLOBIGNORE 환경 변수를 사용할 수 있습니다.
php와 sql을 제외한 모든 파일을 삭제하고 싶다면 다음을 수행하십시오.
export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=
이와 같이 GLOBIGNORE를 설정하면 “ls *”또는 “rm *”와 같은 와일드 카드에서 php 및 sql이 무시됩니다. 따라서 변수를 설정 한 후 “rm *”을 사용하면 txt 및 tar.gz 파일 만 삭제됩니다.
답변
하위 쿼리 목록을 사용하는 것을 선호합니다.
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
-v, –invert-match 비 일치 행 선택
\|
분리 기호
답변
아무도 그것을 언급하지 않았기 때문에 :
- 삭제하고 싶지 않은 파일을 안전한 장소에 복사하십시오
- 모든 파일을 삭제
- 복사 한 파일을 다시 제자리로 이동