100MB보다 크고 20일이 지난 모든 파일을 찾고 해당 .TXT 및 .txt 파일만 개별적으로 압축하고 싶습니다.

100MB보다 크고 20일이 지난 모든 파일을 찾고 해당 .TXT 및 .txt 파일만 개별적으로 압축하고 싶습니다.

나는 그것을 사용하고 있다

find $HOME  -type f -size +100M -mtime +20 -exec zip -m '{}.zip' '{}' \;

이 명령은 모든 파일을 압축합니다. *.TXT 및 *.txt 파일만 압축하고 싶습니다. 우리가 무엇을 해야 할지 아시나요?

답변1

접미사가 비표준 확장자 -size +100M인 경우 100MB (100,000,000바이트) 대신 100MiB(104,857,600바이트)보다 엄격히 큰 크기의 파일이 선택됩니다. M(엄격히) 100MB보다 큰 크기의 경우 필요합니다 -size +100000000c(표준임).

-mtime +20find정확히 21일(또는 호출 시 나노초) 이상된 파일 에 적용됩니다 . 20일보다 오래된 파일이 필요합니다 -mtime +19(적어도 POSIX 호환 find구현에서는 모든 것이 이에 해당되는 것은 아닙니다).

Bourne과 같은 쉘에 있고 그렇지 않다고 가정하면 따옴표를 인용하지 않은 상태로 두는 zsh것은 의미 $HOME가 없습니다. 여기서는 분할+glob을 호출하는 것이 의미가 없기 때문입니다. POSIX 셸 ~에서는 "$HOME".

zip덜 Unix 명령입니다. 기본적으로 와일드카드는 자체적으로 확장되므로 이라는 파일이 있는 경우 실제로 *.txt해당 디렉터리의 zip -m '*.txt.zip' '*.txt'모든 파일을 포함하는 zip 파일이 생성됩니다. txt파일이 example이라는 디렉터리에 있으면 상황이 더 악화될 수 있습니다 *. 이 -nw플래그를 사용하여 이를 방지하거나 이전 zip 형식(예: .zip)을 지원하는 보다 유닉스적인 명령을 사용할 수 있습니다 bsdtar.

이렇게 하면 find ~전달된 모든 경로가 zip절대 경로가 되므로 home/you/dir/file.txt전체 경로( ...)와 함께 멤버가 나열되는 zip 파일이 생성됩니다. 이를 방지 하려면 BSD/GNU -execdir find조건자 또는 옵션을 사용할 수 있습니다 .-jzip

find모든 구현이 {}에서 확장되는 것은 아닙니다 {}.zip. 즉, {}의 매개변수에 가 단독으로 존재하지 않는 경우입니다 -exec. 그렇지 않은 경우에는 를 사용하여 sh전화를 걸어야 합니다 -exec sh -c 'zip -nw -m "$1.zip" -- "$1"' sh {} ';'.

파일 이름을 일치시키려면 조건자를 사용할 수 있습니다 -name. 또는 파일을 '(' -name '*.txt' -o -name '*.TXT' ')'일치시키는 데 사용할 수 있으며 일부 구현 에서는 , ... 파일 도 포함할 수 있습니다 . 많은 구현 에서 파일 이름은 사용자 로케일의 유효한 텍스트여야 합니다. 모든 문자는 이식 가능한 문자 집합의 일부이므로 로케일을 C로 수정하여 파일 경로의 나머지 부분이 사용자 로케일의 유효한 텍스트가 아닌 경우에도 해당 문자로 끝나는 파일과 항상 일치하도록 보장할 수 있습니다.txtTXT-name '*.[tT][xX][tT]'find-iname '*.txt'TxttXTfind-name.txtTXT

그래서:

LC_ALL=C find ~ '(' -name '*.txt' -o -name '*.TXT' ')' \
                -type f \
                -size +100000000c \
                -mtime +19 \
                -execdir zip -nw -m '{}.zip' -- '{}' ';'

또는 zsh다음을 사용하세요.

for f (~/**/*.(txt|TXT)(ND.L+100000000m+19)) zip -j -nw -m $f.zip $f

zip은 1980년대 후반의 오래된 형식이며 오늘날 표준에 비해 압축률이 낮습니다. 유일한 장점은 Microsoft 운영 체제에서 기본적으로 지원되는 유일한 압축 형식이라는 점입니다(사실 보관과 압축을 모두 수행하며 여기서는 후자만 필요합니다).

여기에서 Microsoft 운영 체제와의 상호 운용성이 필요하지 않은 경우 xz. 90년대 초반 제품인데도 동일한 압축 알고리즘을 사용하고 bzip2압축 만 담당하기 때문에 크기도 더 잘 줄일 수 있습니다. 이 모든 기능은 여러 파일을 한 번에 압축할 수 있으므로 압축기를 덜 자주 호출할 수 있으므로 많은 파일을 압축하는 프로세스를 더욱 효율적으로 만듭니다.gzipzip

예를 들어 다음과 같이 할 수 있습니다.

xz ~/**/*.(txt|TXT)(ND.L+100000000m+19)

zsh쉘 에서의 단일 호출은 이러한 모든 파일의 압축을 향상시킵니다 xz.


^하늘일광 절약 시간으로 인한 시계 변경은 고려되지 않기 때문에 달력 날짜가 아닌 86400(24 × 60 × 60) Unix 초입니다.

관련 정보