Unix zipping sub directory, не содержащий родительский каталог

Я хочу заархивировать подкаталог и отправить его в другом месте, проблема у меня есть, когда я использую команду zip, в нее также входят все нежелательные слои каталогов, которые я не хочу.

например.

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt

###unzipped produces the following
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt

###I want
/wanted1/wanted2/file.txt

update: каталог, в котором я хочу заархивировать, имеет множество вложенных каталогов, следовательно, -r. Также было бы здорово иметь дело с абсолютными путями, старым решением, используемым для записи компакт-диска, но мне это действительно не понравилось. Возможно, это лучший (единственный) способ.

Ответ 1

Вам нужно поменять каталоги туда, где вы хотите начать, или, возможно, есть возможность "zip" сделать это для вас. Если вы слишком ленивы, чтобы читать варианты gazillion на странице руководства, как и я, сначала "cd", даже в script. Или вы можете заключить все это в круглые скобки, не затрагивая рабочую директорию оболочки или script:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt)

Или, поскольку вы используете -r, вы, вероятно, хотите больше, чем просто file.txt, поэтому:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted)

Или используйте pushd/popd для перехода/выхода:

pushd Unwanted1/Unwanted2
zip -r ~/new.zip wanted
popd

Это работает в sh/ bash/csh/tcsh.

Ответ 2

Простейший, идиоматический способ:

(cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt)

Теперь у zip, tar, rar, cpio и друзей есть опции для управления тем же, но они могут отличаться от версии к версии и, конечно же, от утилиты архива для архивной утилиты. Я предлагаю вам научиться работать с оболочкой для выполнения работы, и вы можете использовать любой желаемый формат архива.

Другой способ:

(cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip [email protected]

Ответ 3

Ну, может быть, один простой способ сделать

cd ./Unwanted1/Unwanted2
zip -r ../../new.zip ./wanted/file.txt

Но я не знаю, какова ваша ситуация. Возможно, вам нужно бежать из базового каталога? Кроме того, опция "-r" используется, когда вы хотите рекурсивно перемещать каталоги - пример, который вы предоставили, - это один файл.