programing

디렉토리에서 일부 파일을 제외한 모든 파일 제거

telebox 2023. 4. 22. 09:15
반응형

디렉토리에서 일부 파일을 제외한 모든 파일 제거

「」를 사용하고 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 *.basha.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

반응형