sync_directory 900 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/bin/bash
  2. set -e
  3. #set -x
  4. src="$1"
  5. dest="$2"
  6. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
  7. if [ -z "$dest" ]; then
  8. echo >&2 "usage: $0 src dest"
  9. exit 1
  10. fi
  11. seen_files=$(mktemp)
  12. mkdir -p "$dest" || true
  13. $DIR/ipfs ls "$src" | while read HASH SIZE FILENAME; do
  14. FILENAME="${FILENAME%$'\r'}"
  15. dest_file="$dest/$FILENAME"
  16. if [ -e "$dest_file" ]; then
  17. ipfs_file_size=$($DIR/ipfs files stat --format='<size>' "/ipfs/$HASH")
  18. if [ $( stat -c %s "$dest_file") -eq "$ipfs_file_size" ]; then
  19. echo $FILENAME >> "$seen_files"
  20. continue
  21. fi
  22. fi
  23. echo >&2 "Retrieving $HASH => $dest_file"
  24. $DIR/ipfs cat "$HASH" > "$dest_file"
  25. echo $FILENAME >> "$seen_files"
  26. done
  27. after_files=$(mktemp)
  28. ls "$dest" > "$after_files"
  29. comm --nocheck-order -13 "$seen_files" "$after_files" | while read INTRUDER; do
  30. echo rm -f "$dest/$INTRUDER"
  31. done
  32. rm -f "$seen_files"
  33. rm -f "$after_files"