Äquivalent zu "cp --parents" auf dem Mac

2

Das Thema erklärt es - im Grunde habe ich ein Bash-Skript, das auf einem Linux-System und einem Windows-System mit Cygwin verwendet wird, wobei der folgende Befehl perfekt funktioniert:

cp --parents

Wenn Sie jedoch denselben Befehl auf einem Mac im Terminal ausführen, wird der folgende Fehler ausgegeben:

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

Ich benutze den Befehl in diesem Zusammenhang, um eine ausgewählte Liste von Dateien in ein Ausgabeverzeichnis zu kopieren und ihre Verzeichnisstruktur beizubehalten:

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

Was kann ich tun, um das cp --parentsVerhalten zu bekommen ?

udjamaflip
quelle
Wenn Sie die gesamte Verzeichnisstruktur von foo / on down kopieren, rsync -av foo ~/my-output/würde das für Sie funktionieren. Sie können bestimmte Dateien mit Filterregeln auswählen. Aber das weicht langsam von Ihrer ursprünglichen Frage ab.
Kent

Antworten:

1

Ich habe es geschafft, diesen Befehl unter MAC zu synthetisieren, indem ich den Rsync-Parameter -R verwendet habe, um die relative Verzeichnisstruktur der Datei zu kopieren, die ich kopiert habe.

Syntax:

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

Verwendungszweck:

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

Dies führt zu demselben Ergebnis, obwohl ich mir sicher bin, dass durch die Verwendung von RSYNC und nicht von CP ein gewisser Mehraufwand entsteht

udjamaflip
quelle
0

--parentsist wahrscheinlich ein Nicht-POSIX-spezifisches Verhalten für GNU cp, während das cpin OS X abgeleitete BSD es nicht hat.

Sie können wahrscheinlich die gewünschte Funktionalität erhalten, indem Sie GNU cpauf Ihrem Mac installieren und verwenden. Es ist wahrscheinlich Teil eines GNU-Pakets namens fileutils, und Sie können es wahrscheinlich mit Homebrew, MacPorts oder Fink installieren.

Spiff
quelle
0

Haben Sie basename? Wenn ja:

$ 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
malat
quelle