Эквивалент "cp --parents" на Mac

Эквивалент "cp --parents" на Mac

В теме это объясняется — по сути, у меня есть скрипт bash, используемый в системе Linux и системе Windows с Cygwin, где следующая команда работает отлично:

cp --parents

Однако запуск этой же команды на Mac в терминале приводит к следующей ошибке:

cp: illegal option -- -
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

Я использую команду в этом контексте, копируя выбранный список файлов в выходной каталог и сохраняя их структуру каталогов:

cp --parents foo/gen1.file foo/bar/gen2.file foo/gen3.bar bar/foo/bar.file ~/my-output/

Что я могу сделать, чтобы добиться нужного cp --parentsповедения?

решение1

--parentsвероятно, это не-POSIX поведение, специфичное для GNU cp, тогда как в производной от BSD cpOS X его нет.

Вы, вероятно, можете получить желаемую функциональность, установив GNU cpна свой Mac и используя его. Это, вероятно, часть пакета GNU, называемого fileutils, и вы, вероятно, можете установить его с помощью Homebrew, MacPorts или Fink.

решение2

Мне удалось синтезировать эту команду на MAC, используя параметр Rsync -R для копирования относительной структуры каталогов копируемого файла.

Синтаксис:

rsync -R <list of files to copy> <target dir>

Использование:

rsync -R foo/gen1.file foo/bar/gen2.file foo/gen3.bar bar/foo/bar.file ~/my-output/

Это дает тот же результат, хотя я уверен, что, вероятно, есть некоторые дополнительные накладные расходы из-за использования RSYNC вместо CP.

решение3

У вас есть basename? Если да:

$ for i in `ls foo/gen1.file foo/bar/gen2.file foo/gen3.bar bar/foo/bar.file`; do cp $i ~/my-output/`basename $i`; done

Связанный контент