폴더를 복사하여 대상의 작은 파일만 덮어씁니다.

폴더를 복사하여 대상의 작은 파일만 덮어씁니다.

여러 하위 폴더에 많은 수의 PDF 파일이 있습니다./홈/사용자/원본나는 압축을 사용했다고스트 스크립트 PDF 쓰기존재하다/홈/사용자/압축.

고스트 스크립트파일의 약 90%를 압축하는 데는 효과적이지만 나머지 파일은 원본 파일보다 커지게 됩니다.

제 생각에는CP /홈/사용자/압축도착하다/홈/사용자/원본파일 덮어쓰기오직대상보다 작은 항목은 건너뛰고 큰 항목은 건너뜁니다.

어떤 아이디어가 있나요?

답변1

find이를 위해 다음 명령이 작동해야 합니다.

cd /home/user/original
find . -type f -exec bash -c 'file="$1"; rsync --max-size=$(stat -c '%s' "$file") "/home/user/compressed/$file" "/home/user/original/$file"' _ {} \;

솔루션의 핵심 부분 --max-size은 에서 제공 됩니다 rsync. rsync매뉴얼 에서 :

--max-size=SIZE

이는 지정된 SIZE보다 큰 파일을 전송하지 않도록 rsync에 지시합니다.

따라서 이 find명령은 대상 디렉터리(/home/user/original)에서 작동하고 파일 목록을 반환합니다. 각 파일에 대해 명령을 bash실행하는 셸을 생성합니다 . rsync옵션 SIZE매개변수는 대상 파일에서 명령을 실행 --max-size하여 stat설정 됩니다.

실제로 rsync처리 논리는 다음과 같습니다.

  1. 이 매개변수는 소스 파일이 대상 파일보다 큰 경우 소스 --max-size파일이 전송되는 것을 방지합니다 .
  2. 소스 파일이 대상 파일보다 작은 경우 전송은 예상대로 작동합니다.

이 논리를 사용하면 더 작은 파일만 원본 디렉터리에서 대상 디렉터리로 전송됩니다.

나는 이것을 몇 가지 다른 방법으로 테스트했으며 예상대로 작동했습니다. 그러나 시스템에서 시도하기 전에 대상 디렉터리의 백업을 생성할 수 있습니다.

답변2

진주의-에스운영자가 구조하러 옵니다!

실행 가능한 Perl 스크립트를 만듭니다 overwrite-smaller.

#!/bin/perl
use warnings;
use strict;
use File::Copy;

my $file = shift;
(my $compressed = $file) =~ s/original/compressed/;
copy($compressed, $file) if -s $compressed < -s $file;

원래 디렉터리의 모든 파일에 대해 실행합니다.

find /home/user/original -type f -exec overwrite-smaller {} \;

또는 Perl에서는 여기에 하위 트리도 작성합니다.

#!/usr/bin/perl
use warnings;
use strict;

use File::Copy;
use File::Find;

find({no_chdir => 1,
      wanted   => sub {
          my $file = $File::Find::name;
          -f $file or return;
          (my $compressed = $file) =~ s/original/compressed/;
          copy($compressed, $file) if -s $compressed < -s $file;
    }}, 'original');

관련 정보