Поскольку вы не можете использовать rsync или причудливые параметры GNU, вам нужно свернуть свой собственный с помощью оболочки.
Команда find
позволяет вам запустить полную оболочку в -exec
, так что выдолжно быть хорошо идти с однострочником для обработки имен.
Если я правильно понимаю, вы хотите, чтобы только родительский каталог, а не полное дерево, копировался в цель.Следующее может сделать:
#!/usr/bin/env bash
findopts=(
-type f
-mtime -2
-exec bash -c 'd="${0%/*}"; d="${d##*/}"; mkdir -p "$1/$d"; cp -v "$0" "$1/$d/"' {} ./new \;
)
find /home/foo/hint/ "${findopts[@]}"
Результаты:
$ find ./hint -type f -print
./hint/foo/slurm/file.txt
./hint/foo/file.txt
./hint/bar/file.txt
$ ./doit
./hint/foo/slurm/file.txt -> ./new/slurm/file.txt
./hint/foo/file.txt -> ./new/foo/file.txt
./hint/bar/file.txt -> ./new/bar/file.txt
Я поместил параметры find
в массив bash для облегчения чтения и управления.Сценарий для опции -exec
все еще немного громоздкий, поэтому здесь дано описание того, что он делает для каждого файла.Принимая во внимание, что в этом формате опции нумеруются с нуля, {}
становится $0
, а целевой каталог становится $1
...
d="${0%/*}" # Store the source directory in a variable, then
d="${d##*/}" # strip everything up to the last slash, leaving the parent.
mkdir -p "$1/$d" # create the target directory if it doesn't already exist,
cp "$0" "$1/$d/" # then copy the file to it.
Я использовал cp -v
для подробного выводакак показано в разделе «Результаты» выше, но IIRC также не поддерживается Solaris и может быть безопасно проигнорирован.