디렉토리 트리 구조를 복제하고 특정 날짜 이후에 수정된 해당 디렉토리에 파일을 복사합니다.

디렉토리 트리 구조를 복제하고 특정 날짜 이후에 수정된 해당 디렉토리에 파일을 복사합니다.

30개 이상의 하위 디렉터리가 있는 폴더가 있고 지정된 날짜(예: 9월 8일, 이것이 사실임) 이후에 수정된 파일 목록을 가져오고 동일한 트리 구조를 사용하여 복사본을 만들고 싶습니다. 해당 파일만 수정됩니다. 폴더의 파일

나는 30개의 디렉토리를 말했고 마지막 수정 날짜 찾기 파일 목록을 사용하여 명령 출력을 찾았습니다.

a/a.txt
a/b/b.txt
a/www.txt
etc..

예를 들어, "a" 폴더를 생성하고 그 안에 a.txt만 포함하고 싶습니다... 마찬가지로 다른 폴더에 대해서도 "a/b"가 생성되고 그 안에 b.txt가 포함됩니다...

답변1

텍스트 파일에 필요한 파일이 있다고 가정하면 다음과 같은 작업을 수행할 수 있습니다.

while IFS= read -r file; do 
    echo mkdir -p ${file%/*}; 
    cp /source/"$file" /target/${file%/*}/${file##*/}; 
done < files.txt 

그러면 목록의 각 줄을 읽고, 디렉터리와 파일 이름을 추출하고, 디렉터리를 만들고, 파일을 복사합니다. source및를 target사용 중인 실제 상위 디렉토리로 변경 해야 합니다 . 예를 들어 /foo/a/a.txt에 복사하려면 을 및 으로 변경 /bar/a/a.txt합니다 .sourcefootargetbar


귀하의 질문에서 복사하려는지 알 수 없습니다모두디렉터리를 선택한 다음 특정 파일만 원하는 경우 또는 파일이 포함된 디렉터리만 원하는 경우. 위의 솔루션은 필요한 디렉터리만 생성합니다. 이 모든 것을 생성하려면 다음을 사용하십시오.

find /source -type d -exec mkdir -p {} /target

그러면 디렉토리가 생성됩니다. 이러한 파일이 존재하면 파일을 복사하면 됩니다.

while IFS= read -r file; do 
    cp /source/"$file" /target/"$file"
done

고쳐 쓰다

이 작은 스크립트는 9월 8일 이후에 수정된 모든 파일을 이동합니다. .findtouch​Linux를 사용한다고 가정하면 이것이 가능합니다.

#!/usr/bin/env bash    

## Create a file to compare against.
tmp=$(mktemp)
touch -d "September 8" "$tmp"

## Define the source and target parent directories
source=/path/to/source
target=/path/to/target

## move to the source directory
cd "$source"

## Find the files that were modified more recently than $tmp and copy them
find ./ -type f -newer "$tmp" -printf "%h %p\0" | 
    while IFS= read -rd '' path file; do
        mkdir -p "$target"/"$path"
        cp "$file" "$target"/"$path"
    done

엄밀히 말하면 tmp 파일은 필요하지 않습니다. 그러나 이렇게 하면 내일도 동일한 스크립트가 작동합니다. 그렇지 않고 find's 를 사용하면 -mtime매일 정확한 날짜를 계산해야 합니다.


또 다른 방법은 먼저 디렉터리를 찾아 대상에 만든 다음 파일을 복사하는 것입니다.

  1. 만들다모두목차

     find ./ -type d -exec mkdir -p ../bar/{} \;
    
  2. 관련 파일 찾기 및 복사

     find ./ -type f -newer "$tmp" -exec cp {} /path/to/target/bar/{} \;
    
  3. 빈 디렉터리 모두 삭제

     find ../bar/ -type d -exec rmdir {} \;
    

답변2

공원

공원작업에 가장 적합한 도구입니다. 이는 POSIX를 cpio대체 하며 tar( tar그와 달리 아카이브 생성 및 추출뿐만 아니라 통과 모드도 포함합니다). 아쉽게도 일부 Linux 배포판의 기본 설치에서는 생략되어 있지만 단지 apt-get// yum/ emerge... 호출일 뿐입니다.

Pax에는 제한 사항이 있습니다. 최근에 수정된 디렉토리에는 복사할 파일이 포함되어 있지 않더라도 복사됩니다. 그런 다음 빈 디렉터리를 삭제할 수 있습니다(유지하려는 대상에 기존의 빈 디렉터리가 없는 경우).

cd /path/to/source
pax -rw -pp -T 201409080000 . /path/to/destination/
find /path/to/destination/ -depth -type d -exec rmdir {} +

pax필터 없이 유사하지만 동일하지 않은 사용 사례 에 적용할 수 있는 다른 방법을 언급하겠습니다 .

지쉬

사용글로벌 예선 m수정 시간별로 파일을 일치시키고(예: m-10지난 10일 이내에 수정된 파일. 대신 다른 단위를 사용할 수 있음) .일반 파일을 일치시킵니다. 이것기록 수정자 h파일 이름의 디렉터리 부분을 유지합니다.

cd /path/to/source
for x in **/*(.m-10); do
  mkdir -p -- $x:h
  cp -p -- $x /path/to/destination/$x
done

또는 다음을 사용할 수 있습니다.zmv함수는 와일드카드 표현과 일치하는 파일을 복사합니다. 대상 디렉터리를 생성하는 기본 제공 방법이 없으므로 이를 수행하는 함수를 제공했습니다.

autoload -U zmv
mkdir_cp () {
  mkdir -p -- ${(P)#}:h
  cp -- $@
}
cd /path/to/source
zmv -p mkdir_cp -Q '**/*(.m-10)' '/path/to/destination/$f'

POSIX 조회

Pass 를 사용하면 지난 10일 이내에 수정된 파일을 일치시키거나 이후 수정된 파일을 일치시키는 데 find사용할 수 있습니다 .-mtime -10-newer reference_timereference_files

touch -t 201409080000 /tmp/reference_time
cd /path/to/source
find . -type f -newer /tmp/reference_time -exec sh -c '
  mkdir -p /path/to/destination/"${0%/*}"
  cp "$0" "/path/to/destination/$0"
' {} \;

답변3

find이 작업을 수행하려면 with를 사용할 수 있습니다 rsync.

find ./source/ -newer /tmp/foo -print0 | rsync -av --files-from=- --from0 ./ ./destination/ 

시험

  1. 나는 2개의 디렉토리를 만들었습니다.원천그리고목적지.
  2. 테스트 목적으로 아래와 같이 타임스탬프가 포함된 임시 파일을 만들었습니다.

    touch --date "2014-09-08" /tmp/foo
    
  3. 이제 내부원천디렉터리에 복사해야 하는 여러 하위 디렉터리를 만들었습니다.목적지디렉토리(일부 하위 디렉토리에는 테스트 목적으로 공백이 있음) 또한 몇 가지 샘플 파일도 만들었습니다. 이것 목적지디렉토리가 현재 비어 있습니다.

  4. 하위 디렉터리에 있는 파일 중 하나의 생성 날짜를 변경했습니다.

    touch -c -t 1110111730 oldfile
    
  5. 이제 find지정된 대로 명령을 실행합니다. 이 find 명령은 우리가 지정한 기준에 따라 모든 파일을 찾은 다음 명령으로 생성된 파일 목록을 파이프합니다 rsync.find

지금목적지디렉터리에 지정된 파일이 oldfile우리가 원하는 것보다 빠르기 때문에 거기에 있어서는 안 됩니다.

그래서 확인하기 위해 디렉토리로 이동하여 destination원하는 모든 하위 디렉토리 구조와 검색 기준과 일치하는 모든 파일을 얻었으나 지정된 파일이 oldfile존재하지 않습니다.

인용하다

http://www.commandlinefu.com/commands/view/1481/rsync-find

답변4

이것이 바로 cpio디자인이 사용되는 방식입니다.

find . -whatever -print | cpio -pvmd /path/to/copy/to/.

완벽한.

관련 정보