You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.1 KiB
42 lines
1.1 KiB
#!/bin/zsh |
|
# (c) 2015 Taeyeon Mori |
|
# Sync files while making sure to replace characters invalid on FAT |
|
# Hidden files (.*) are ignored |
|
# Useful for copying music to a music player or smartphone sd-card |
|
|
|
source "$DOTFILES/lib/libzsh-utils.zsh" |
|
|
|
if [[ -z "$1" || -z "$2" || "$1" == "--help" || "$1" == "-h" || "$1" == "help" ]]; then |
|
echo "Usage: $0 <source_dir> <dest_dir> [cp-opts]" |
|
exit 1 |
|
fi |
|
|
|
set -e |
|
|
|
destination=`realpath "$2"` |
|
|
|
cd "$1" |
|
IFS=$'\0' |
|
|
|
function sanitize { |
|
local temp |
|
temp="${*#./}" # Remove ./ |
|
echo ${temp//[:?<>*|^]/_} # Replace invalid characters |
|
} |
|
|
|
msg "Creating structure..." |
|
for dir in $(find . -not -path "*/.*" -type d -print0); do |
|
target="$destination/$(sanitize $dir/)" |
|
test -d "$target" || mkdir "$target" |
|
done |
|
|
|
msg "Copying files..." |
|
for source in $(find . -not -path "*/.*" -type f -print0); do |
|
target="$destination/$(sanitize $source)" |
|
if [[ ! -e "$target" || "$target" -ot "$source" || $(stat -c%s "$source") -ne $(stat -c%s "$target") ]]; then |
|
color 31 cp $3 "$source" "$target" |
|
elif [[ "$3" =~ "-v" ]]; then |
|
color 33 echo "OK $target" |
|
fi |
|
done |
|
|
|
|