rsyncにパターンと一致するファイルが含まれている場合にのみ、rsyncを使用してディレクトリとサブコンテンツ全体を除外できますか?

rsyncにパターンと一致するファイルが含まれている場合にのみ、rsyncを使用してディレクトリとサブコンテンツ全体を除外できますか?

完全なディレクトリと「.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を使用して他のすべてのフォルダをごみ箱フォルダに移動し、エラーが発生せずに回復できるように、以下のフルパスを維持します。 。破壊的に。

このソリューションが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

おすすめ記事