한 디렉터리의 모든 파일을 다른 디렉터리로 이동하되 최신 파일은 복사하는 방법은 무엇입니까?

한 디렉터리의 모든 파일을 다른 디렉터리로 이동하되 최신 파일은 복사하는 방법은 무엇입니까?

디렉터리의 모든 파일을 이동하지만 가장 최근에 수정된/최신 파일만 복사하는 백업 스크립트를 작성하려고 합니다.

find수정된 파일을 가져 오거나 ls나열할 수 없고 파일 이름만 출력할 수도 없기 때문에 올바른 최신 파일을 반환할 수 없는 문제가 있습니다 . 그래서 내 파일은 $latestfile결국 다른 파일이 됩니다.

돕다?

내 현재 코드:

# Primary Backup Location
BACKUP_LOCATION=/my/backup/dir

# List latest file
latestfile=$(find ${BACKUP_LOCATION} -maxdepth 1 -mindepth 1 -type f -exec basename {} \; | sort -nr | awk "NR==1,NR==1 {print $2}")

echo "Latest file is $latestfile"

# List all (EXCEPT LAST) files and get ready to Backup
echo "Backing up all files except last"
for file in $(find ${BACKUP_LOCATION} -maxdepth 1 -mindepth 1 -type f \! -name "$latestfile" -printf "%f\n" | sort -nr )
do
    echo $file
    #mv $file /some/target/dir/$file
done


답변1

이 작업을 수행하는 방법을 알아보세요. 이것은 내 백업 스크립트의 일부입니다. 누군가가 유용하다고 생각하기를 바랍니다.

# Location to Backup from
BACKUP_TARGET="/my/dir/to/backup"
# Location to Backup to
BACKUP_LOCATION="/my/backup/store"

# List latest file
file_latest=$(find ${BACKUP_TARGET} -maxdepth 1 -mindepth 1 -printf '%T+ %p\n' | sort -r | head -n 1 | sed 's|.*/||' )
echo "Latest file is $file_latest"

# List the rest of files
file_rest_of_em=$(find ${BACKUP_TARGET} -maxdepth 1 -mindepth 1 -type f \! -name "$file_latest" | sed 's|.*/||' )

# make newlines the only separator
IFS=$'\n'

# Backup all previous Backups, MOVE ALL
echo "Backing up all files except Latest Backup..."
for file in $file_rest_of_em
do
    echo "Moving $file"
    mv -n ${BACKUP_TARGET}/$file $BACKUP_LOCATION/
done

# Backup Latest Backup, LEAVE COPY BEHIND
if [ -f "$BACKUP_LOCATION/$file_latest" ]; then
    echo "$file_latest (Latest Backup) already exists."
else
    echo "$file_latest (Latest Backup) does not exist."
    echo "Copying $file_latest..."
    cp -n --preserve=all ${BACKUP_TARGET}/$file_latest $BACKUP_LOCATION/
fi

# done with newline shenanegans
unset IFS

도와주셔서 감사합니다 @Panki

관련 정보