백업에 사용되는 디렉터리에 대한 정리 스크립트를 생성하고 싶습니다.
예: 내 디렉터리에 파일 이름에 숫자가 있는 파일이 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
텍스트 파일을 제외한 모든 파일 목록이 표시됩니다.