전체 디렉터리와 ".protect" 파일이 포함된 디렉터리의 내용을 제외하여 Linux에서 rsync를 사용하여 약 20TB의 NAS를 정리하려고 합니다.
다음과 같은 하위 폴더에 매우 큰 캐시를 생성합니다.
캐시/시뮬레이션_v001/reallybigfiles_*.bgeo
캐시/시뮬레이션_v002/reallybigfiles_*.bgeo
캐시/시뮬레이션_v003/reallybigfiles_*.bgeo
해당 파일이 존재하는 경우 -cache/simulation_v002/.protect
그런 다음 캐시/시뮬레이션_v002/ 및 모든 내용을 제외하고 모든 폴더를 임시/재활용 위치로 이동하는 rsync 작업을 구축하고 싶습니다.
이전에 Python으로 비슷한 작업을 수행한 적이 있지만 rsync나 다른 방법을 사용하여 더 쉽게 만들 수 있는지 궁금합니다.
답변1
Cas의 팁 덕분에 bash 스크립트를 사용하여 문제를 해결하는 이 워크플로를 만들 수 있었습니다. 더 빠른 작업을 달성하기 위해 작동하면 더 좋을 것이기 때문에 이상적이지는 않습니다(rsync에 이 기능이 있었으면 좋겠습니다). 스크립트는 찾기를 사용하여 현재 폴더에서 파일을 검색하고 제외 목록을 생성한 다음 기본 볼륨에서 rsync를 사용하여 다른 모든 폴더를 휴지통 폴더로 이동하고 오류가 발생하지 않고 복구될 수 있도록 아래 전체 경로를 유지합니다. 파괴적으로 .
이 솔루션이 git dev 분기에 있는 경우 현재 상태에 연결합니다.https://github.com/firehawkvfx/openfirehawk-houdini-tools/blob/dev/scripts/modules/trashcan.sh
#!/bin/bash
# trash everything below the current path that does not have a .protect file in
# the folder. it should normally only be run from the folder such as
# 'job/seq/shot/cache' to trash all data below this path.
# see opmenu and firehawk_submit.py for tools to add protect files based on
# a top net tree for any given hip file.
argument="$1"
echo ""
ARGS=''
if [[ -z $argument ]] ; then
echo "DRY RUN. To move files to trash, use argument -m after reviewing the exclude_list.txt and you are sure it lists everything you wish to protect from being moved to the trash."
echo ""
ARGS1='--remove-source-files'
ARGS2='--dry-run'
else
case $argument in
-m|--move)
echo "MOVING FILES TO TRASH."
echo ""
ARGS1='--remove-source-files'
ARGS2=''
;;
*)
raise_error "Unknown argument: ${argument}"
return
;;
esac
fi
current_dir=$(pwd)
echo "current dir $current_dir"
base_dir=$(pwd | cut -d/ -f1-2)
echo "base_dir $base_dir"
source=$(realpath --relative-to=$base_dir $current_dir)/
echo "source $source"
target=trash/
echo "target $target"
# ensure trash exists at base dir.
mkdir -p $base_dir/$target
echo ""
echo "Build exclude_list.txt contents with directories containing .protect files"
find . -name .protect -print0 |
while IFS= read -r -d '' line; do
path=$(realpath --relative-to=. "$line")
dirname $path
done > exclude_list.txt
path_to_list=$(realpath --relative-to=. exclude_list.txt)
echo $path_to_list >> exclude_list.txt
cat exclude_list.txt
cd $base_dir
# run this command from the drive root, eg /prod.
rsync -a $ARGS1 --prune-empty-dirs --inplace --relative --exclude-from="$current_dir/exclude_list.txt" --include='*' --include='*/' $source $target $ARGS2 -v
cd $current_dir