Я думаю, что для этого требуется массив bash.
#!/usr/bin/env bash
# Make an associative array
declare -A files=()
# Populate array as $files[file.pdf]="/path/to/file.pdf"
for f in 20*/*/*.pdf; do
files[${f##*/}]="$f"
done
# Step through files and replace
for f in new-files/*.pdf; do
if [[ ! -e "${files[${f##*/}]}" ]]; then
echo "ERROR: missing $f" >&2
continue
fi
mv -v "$f" "${files[${f##*/}]}"
done
Обратите внимание, что для ассоциативных массивов требуется bash версия 4 или выше. Если вы используете собственный bash на Ma c, это не будет работать как есть.
Обратите внимание, что если вы удалите continue
в последних строках, то mv
команда НЕ будет безопасно перемещать файлы, которые не существуют в каталогах с датой ha sh, поскольку цель не известна.
Если вы хотели получить дополнительную защиту, вы можете использовать test -nt
или друзей, чтобы подтвердить, что обновление происходит в правильном направлении.