디렉토리에서 일부 파일을 제외한 모든 파일 제거
「」를 사용하고 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 | 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
.
루트에서 모든 파일을 반복적으로 삭제하려고 하면 시스템에 큰 문제가 발생하기 때문에 루트에 백업 디렉토리를 선택합니다.
물론 더 우아한 방법이 있겠지만, 이것은 꽤 간단합니다.
하위 쿼리 목록을 사용하는 것이 좋습니다.
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
-v, --syslog-match가 일치하지 않는 행을 선택합니다.
\|
유사한 이름의 파일을 보존하지 않으려면:
rm -r `ls | grep -v "^textfile.txt$\|^backup.tar.gz$"`
이러한 이름을 가진 파일이 디렉토리 트리의 여러 위치에 있고 모든 파일을 보존하려는 경우:
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 파일만 삭제됩니다.
아무도 언급하지 않았기 때문에:
- 삭제하지 않을 파일을 안전한 장소에 복사하다
- 모든 파일을 삭제하다
- 복사한 파일을 원래 위치로 되돌리다
이 경우 for 루프를 쓸 수 있습니다.%)
for x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
작전에는 조금 늦었지만, 구글을 통해 훨씬 늦게 이곳에 도착하는 사람들에게 도움이 되길 바랍니다.
@awi의 답변과 @Jamie Block의 -delete에 대한 코멘트가 매우 도움이 되었습니다.최소한의 입력으로 매번 다른 파일 이름/유형을 무시하고 다른 디렉토리에서 이 작업을 수행할 수 있는 간단한 유틸리티입니다.
rm_except(또는 이름을 붙이고 싶은 경우)
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
예: 텍스트 파일 및 foo.bar을 제외한 모든 항목을 삭제하려면:
rm_except *.txt foo.bar
@mishunika와 비슷하지만 if 구가 없습니다.
제가 강력히 추천하는 것을 사용하고 있다면요.
rm -rf ^file/folder pattern to avoid
★★★★★★★★★★★★★★★★ extended_glob
setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
테스트 방법:
rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)
공백이 있는 이름은 (항상 그렇듯이) 어렵다.Virtualbox\ VMs
대신 인용구를 사용합니다. 삭제됩니다.(「 」 「 」 「 。Virtualbox VMs
를 참조해 주세요.
그냥:
rm $(ls -I "*.txt" ) #Deletes file type except *.txt
또는 다음 중 하나를 선택합니다.
rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf
파일을 불변으로 합니다.루트도 삭제할 수 없습니다.
chattr +i textfile.txt backup.tar.gz script.php database.sql info.txt
rm *
하다
이치노
chattr -i *
당신이 사용할 수 있다고 믿습니다.
rm -v !(filename)
파일명을 제외한 다른 모든 파일은 디렉토리에서 삭제되며 사용자가 해당 파일을 사용하고 있는지 확인합니다.
, 「@siwei-shen」이 필요합니다.-o
여러 패턴을 수행하도록 플래그를 지정합니다.-o
는 ' 또는 'or'는 'or'의 약자입니다.
find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm
이 작업은 2개의 명령 시퀀스를 사용하여 수행할 수 있습니다.먼저 제외하지 않을 파일 이름을 사용하여 배열을 정의합니다.
files=( backup.tar.gz script.php database.sql info.txt )
그 후, 제외하는 디렉토리의 모든 파일을 루프 해, 제외하지 않는 배열에 파일명이 있는지를 체크합니다.그렇지 않은 경우는, 파일을 삭제합니다.
for file in *; do
if [[ ! " ${files[@]} " ~= "$file" ]];then
rm "$file"
fi
done
제가 찾던 답변은 스크립트를 실행하는 것이었는데 스크립트 자체를 삭제하는 것을 피하고 싶었습니다.그래서 만약 누군가가 비슷한 답을 찾고 있다면, 다음을 하세요.
.sh 파일을 만들고 다음 코드를 작성합니다.
cp my_run_build.sh ../../
rm -rf * cp
../../my_run_build.sh .
/*amend rest of the script*/
아직 아무도 이에 대해 언급하지 않았기 때문에, 한 가지 특별한 경우:
OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES
그냥)rm $OLD_FILES
)
또는
OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES
하면 '어울리지 않다'를 써야 할 도 있어요.shopt -s nullglob
파일이 있는지 없는지 확인합니다.
SET_OLD_NULLGLOB=`shopt -p nullglob`
shopt -s nullglob
FILES=`echo *.sh *.bash`
$SET_OLD_NULLGLOB
이 없는 경우, nullglob은 "nullglob입니다.echo *.sh *.bash
a.a. *.a.sh *.httpb.sh 라고 경우가 .
(그렇지만, OSX에서는 동작하지 않지만, 저 자신도 이 답변을 선호합니다.)
직접 명령어를 사용하는 대신 현재 dir 외부에 있는 temp dir로 필요한 파일을 이동하십시오. 다음 '를 사용해서 모든 파일을 삭제합니다.rm *
★★★★★★★★★★★★★★★★★」rm -r *
.
그런 다음 필요한 파일을 현재 dir로 이동합니다.
file.name을 제외한 모든 항목을 삭제합니다.
ls -d /path/to/your/files/* |grep -v file.name|xargs rm -rf
언급URL : https://stackoverflow.com/questions/4325216/remove-all-files-except-some-from-a-directory
'programing' 카테고리의 다른 글
Visual Studio 2010을 완전히 제거하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
---|---|
git 오류: RPC 실패, 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 (0) | 2023.04.22 |
Swift에서 난수를 생성하는 방법은 무엇입니까? (0) | 2023.04.22 |
도메인 객체, POCO 및 엔티티의 차이점은 무엇입니까? (0) | 2023.04.22 |
Bash 인수에서 따옴표를 유지하는 방법 (0) | 2023.04.22 |