전체 크기의 마지막으로 사용된(또는 생성된) 파일을 다른 폴더에 복사하고 싶습니다. 추가 도구 없이 이것이 가능합니까?
폴더의 전체 크기보다 작은 특정 크기의 USB 드라이브가 있습니다. 모든 파일을 USB에 복사할 수 없기 때문에 더 이상 공간이 없을 때까지 최신 사용량을 기준으로 복사하는 것을 좋아합니다. 이상적으로 이 방법은 모든 파일을 지우고 다시 복사할 필요 없이 파일 업데이트를 지원합니다.
답변1
([linux] 태그를 기반으로) 및 명령 bash
뿐만 아니라 사용할 수 있다는 가정하에 ; 가장 최근에 수정된 파일을 먼저 동기화하려는 추가 가정에 따라(참조stat
sort
남자 통계다른 타임스탬프 옵션의 경우), 여기에 현재 디렉터리의 모든 파일을 반복하는 bash 스크립트가 있습니다( for f in *
이에 대한 핵심 행입니다). 마지막으로 수정된 타임스탬프를 배열로 수집한 다음 정렬된 타임스탬프를 반복하고 인쇄 - 샘플입니다! -- 각 파일에 대한 rsync 명령(현재 증거로 첨부된 타임스탬프 디버깅 정보가 있음)
물론 특정 상황에 맞게 rsync 명령을 조정해야 합니다. 이 스크립트는 현재 디렉터리의 모든 파일에 대해 rsync 명령을 출력합니다. 내 제안은 이러한 rsync의 "맹목적으로" 실행하여 마지막에 있는 것이 실패하도록 하거나 스크립트에 넣어 별도로 실행하는 것입니다.
이 스크립트는 어떤 방식으로든 대상의 공간 활용을 최적화하려고 시도하지 않습니다. 유일한 순서는 마지막 수정 타임스탬프입니다(동일한 초에 여러 파일이 수정된 경우 연관 배열의 임의 순서). .
#!/usr/bin/env bash
declare -A times
# gather the files and their last-modified timestamp into an associative array,
# indexed by filename (unique)
for f in *
do
[ -f "$f" ] && times[$f]=$(stat -c %Y "$f")
done
# get the times in (unique) sorted order
for times in ${times[@]}
do
echo $times
done | sort -run | while read t
do
# then loop through the array looking for files with that modification time
for f in "${!times[@]}"
do
if [[ ${times[$f]} = $t ]]
then
echo rsync "$f" -- timestamp ${times[$f]}
fi
done
done
답변2
파일을 수정 날짜별로 정렬한 다음 해당 순서대로 이름을 전달하여 rsync
복사해야 합니다. cp
대신 사용할 수도 있지만 rsync
더 효율적입니다.
superuser.com에는 이 작업을 수행하는 방법에 대한 스레드가 이미 있습니다.https://superuser.com/a/208749/554082