С php я пользуюсь exec("tar -xf archive.tar -C /home/user/target/folder")
извлечь содержимое определенного архива (archive.tar) в целевой каталог (/ home / user / target / folder), чтобы все существующее содержимое целевого каталога было перезаписано новыми, содержащимися в архиве.
Он работает нормально, и все файлы в целевом каталоге перезаписываются после извлечения, но есть один каталог в архиве, который я хотел бы пропустить (из извлечения и, таким образом, перезаписи существующего в целевой папке) …
Например, archive.tar содержит:
folderA /
folderB /
folderC /
folderD /
fileA.php
fileB.php
fileC.xml
Как я могу извлечь (и перезаписать) все, кроме (например) папки C /? Другими словами, я хочу, чтобы папка C и ее содержимое оставались нетронутыми в директории пользователя и не были перезаписаны папкой, содержащейся в архиве tar.
Какие-либо предложения?
(Tar на хостинг-сервере — это версия 1.23 GNU)
Вы можете использовать ‘—exclude’, чтобы пропустить папку:
tar -xf archive.tar -C /home/user/target/folder" --exclude="folderC"
Есть --exclude PATTERN
вариант в tar
инструмент. Проверьте:
tar на linuxcommand.org
записывать --exclude='./folder'
в начале команды tar. В вашем случае это
exec("tar -x --exclude='./C' -f archive.tar -C /home/user/target/folder")
Чтобы быть в безопасности, вы можете удалить все разрешения на запись из папки. Например:
$ chmod 000 folderC/
Затем сделайте обычное извлечение tar (как обычный пользователь). Вы получите несколько сообщений об ошибках на консоли, но ваша папка останется нетронутой … В конце tar, верните исходные разрешения вашей папке. Например:
$ chmod 775 folderC/
Конечно, опция «—exclude» tar является правильным решением этой конкретной проблемы, но, если вы не уверены на 100% в синтаксисе команды, и вы обрабатываете критический данные, мое решение ставит вас в безопасное место :-).