[bash] 디렉토리에서 일부를 제외한 모든 파일을 제거하십시오.

를 사용할 때 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 ffind를 지정하지 않으면 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 비 일치 행 선택

\| 분리 기호


답변

아무도 그것을 언급하지 않았기 때문에 :

  • 삭제하고 싶지 않은 파일을 안전한 장소에 복사하십시오
  • 모든 파일을 삭제
  • 복사 한 파일을 다시 제자리로 이동