grep 항목을 제외하고 폴더의 모든 항목을 삭제하는 방법

grep 항목을 제외하고 폴더의 모든 항목을 삭제하는 방법

백업에 사용되는 디렉터리에 대한 정리 스크립트를 생성하고 싶습니다.

예: 내 디렉터리에 파일 이름에 숫자가 있는 파일이 10개 있습니다.

예를 들어:

b_100
b_101
b_102
b_103
b_104
b_105
b_106
b_107
b_108
b_109
b_110

b_105~b_110 디렉터리의 특정 파일을 grep하고 나머지 파일을 모두 삭제하고 싶습니다. 즉, b_100 b_101 b_102 b_103 b_104가 모두 삭제/삭제됩니다.

b_110과 같은 디렉터리에 있는 파일을 grep하려면 grep되지 않은 모든 항목을 삭제하세요.

답변1

그리고 zsh:

setopt extendedglob
rm -rf -- ^b_<105-110>

b_이름이 십진수로 시작하고 끝나며 값이 105에서 110 사이인 파일과 디렉터리를 제외하고 숨겨지지 않은 모든 파일과 디렉터리가 삭제됩니다 .

파일 만 삭제하려는 경우 b_*:

rm -rf -- b_(*~<105-110>)

~zsh글로벌 운영자 입니다와는 별개로.

아니면 이렇게 할 수도 있습니다:

all_b_files=(b_*)
to_exclude=(b_{105..110})
rm -rf -- ${all_b_files:|to_exclude}

그리고 ksh93또는 bash -O extglob(또는 zsh -o kshglob):

set -- b_{105..110} # set positional parameters to b_105 b_106...
IFS='|'             # used for joining positional parameters in "$*"
pattern="$*"        # prepare extended ksh glob
IFS=                # empty IFS to prevent splitting
rm -rf -- !($pattern)

답변2

Bash 및 확장 와일드카드를 활성화하면 다음을 수행할 수 있습니다.

shopt -s extglob 
glob=$(echo b_{105..110} | sed 's/ /|/g')
rm -- !($glob)

먼저 변수를 glob다음 출력으로 설정합니다.

$ echo b_{105..110} | sed 's/ /|/g'
b_105|b_106|b_107|b_108|b_109|b_110

따라서 필요한 파일 이름 목록은 다음과 같습니다 |. 그러면 명령은 rm -- !($glob)일치하지 않는 모든 파일을 삭제합니다 $glob.

답변3

find를 사용하여 디렉터리에서 일치하지 않는 모든 파일을 나열할 수 있습니다.

find /path/to/directory -not -name "file_name_to_keep" -type f

그런 다음 find의 출력을 xargs로 파이프하거나 find의 내장 exec 또는 삭제 기능을 사용할 수 있습니다.

find /path/to/directory -not -name "file_name_to_keep" -type f -exec rm "{}" \;

또는 GNU find에 내장된 삭제 옵션을 사용하세요.

find /path/to/directory -not -name "file_name_to_keep" -type f -delete

찾기 결과를 기반으로 한 다양한 삭제 방법에 대한 자세한 내용은 다음과 같습니다."찾기" 출력을 기반으로 디렉터리를 삭제하는 방법은 무엇입니까?

답변4

-v나는 전체 질문을 읽지 않았지만 "grep 항목 제외"라고 말했을 때 즉시 "...을 제외한 모든 것"을 의미하는 grep 매개 변수를 모른다고 생각하게 만들었습니다 . 예를 들면 다음과 같습니다.

ls -ltra | grep -v .txt

텍스트 파일을 제외한 모든 파일 목록이 표시됩니다.

관련 정보