4

На странице руководства говорится

-C directory
      In c and r mode, this changes the directory before adding the following files.

Однако tar не изменяется в каталог, который я указываю, а вместо этого сообщает

tar: <folder name>: Cannot stat: No such file or directory

для каждой папки в каталоге я запускаю команду tar.

Я действительно должен сделать что-то вроде

cd <folder> && tar ... && cd -

или есть способ получить эту работу?

3 ответа3

2

Я думаю, что вы не можете использовать опцию -C как вы предполагаете в этом вопросе.

Раздел 6.10.1 Changing the Working Directory в руководстве по GNU для tar описывает параметр -C следующим образом:

Чтобы изменить рабочий каталог в середине списка имен файлов, либо в командной строке, либо в файле, указанном с помощью '--files-from' ('-T'), используйте '--directory' ('-C «). Это изменит рабочий каталог на указанный каталог после этой точки в списке.

‘--directory=directory’
‘-C directory’

Изменяет рабочий каталог в середине командной строки.

Например,

$ tar -c -f jams.tar grape prune -C food cherry

поместит файлы 'grape' и 'prune' из текущего каталога в архив 'jams.tar', а затем файл 'cherry' из каталога 'food'. Эта опция особенно полезна, когда у вас есть несколько широко разделенных файлов, которые вы хотите сохранить в одном архиве.

Обратите внимание, что файл 'cherry' записывается в архиве под точным названием 'cherry', а не 'food /cherry'. Таким образом, архив будет содержать три файла, которые, кажется, все пришли из одного каталога; если архив извлекается с помощью простого tar -extract, все три файла будут записаны в текущем каталоге.

На странице руководства есть еще несколько примеров ...


Обновить:
Я обычно не смешиваю файлы с разных путей в один tar-шар.
Тем не менее, если это то, что вы хотите, есть две вещи, которые можно сделать,

  1. Используйте опцию -T со списком каталогов / файлов, которые вы хотите упаковать вместе.
    Это соберет все вещи вместе с дополнительными префиксами пути.
  2. Используйте опцию -h в каталоге 'link image'
    (вы делаете один из них со скриптом для создания ссылок на интересующие вас файлы и каталоги в новом и пустом каталоге)
    Опция -h используемая в таком каталоге, создаст один tar-шар, который представляет макет файла в этом каталоге.
1

Лично я предпочитаю использовать подоболочки, чтобы получить tar в "положение". Я никогда не изучал опцию -C , поэтому я не уверен, как она работает.

Предположим, мой CWD - /path/a, и я хочу создать тарбол из /path/b/foo без ведущего /path/b:

user@host:/path/a$ ( cd /path/b && tar czf ~/tarball.tgz foo )
user@host:/path/a$

Полученный архив содержит каталог foo/ и все его содержимое, но не ведущий / путь / b. Subshell выполняет CD, затем tar, если CD успешно, а затем возвращается к моей исходной оболочке в том же CWD.

1

tar -C не работает с подстановочными знаками, потому что, как сказал Хенно в одном из комментариев:

* будет расширен оболочкой на основе вашего текущего каталога, прежде чем он будет передан в tar

Так что, если вы пытаетесь сделать что-то вроде:

tar -cvzf myfile.tgz -C somepath *

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .