Вы можете сопоставить эти файлы с помощью простого шаблона оболочки и флага--relative
(-R
)для сохранения путей к файлам в месте назначения:
rsync -avR src/./201?/*bbb*.pdf dst/
Пример запуска с использованием ваших данных
rsync -avR src/./201?/*bbb* dst/
created directory dst
sending incremental file list
2016/
2016/aaabbb1.pdf
2016/aaabbb2.pdf
2017/
2017/aaabbb1.pdf
2017/aaabbb2.pdf
Вы можете проверить, что произойдет, используя rsync --dry-run
.
Третье решение требует, чтобы все исходные файлы находились в одной и той же файловой системе, и, таким образом, жесткие ссылки могут быть сделаны произвольно на любой из файлов.
Сохраните карту файлов в файлеfilemap.txt
:
$ cat << EOF > filemap.txt
1/1/1/file.jpg -> 2/3/4/image1.jpg
2/12/2/file.jpg -> 5/6/7/image2.jpg
3/31/31/file.jpg -> 8/9/1/image3.jpg
EOF
Затем используйте этот сценарий для создания временного выходного каталога с именем temp
, который будет содержать подкаталоги -, соответствующие целевым путям вашей карты файлов. Каждое имя исходного файла, в свою очередь, будет жестко -связано с соответствующим путем назначения в каталоге temp
. Как только temp
будет полностью заполнен, он будет rsync
изменен на user:ip
, а затем удален с локальной машины.
#!/usr/bin/env bash
srcD="/folder/"
destD="/dir/"
rm -rf temp
while read src X dest
do
dir="$(dirname "$dest")"
mkdir -p "temp/$dir"
ln "$srcD$src" "temp/$dest"
done < filemap.txt
rsync -av temp/ user@ip:"$destD"
rm -rf temp