Мне бы хотелось иметь простой PHP скрипт (без внешних зависимостей), который мог бы создавать дословный архив каталога. Этот каталог может содержать все допустимые значения, в том числе пустые каталоги и битые символические ссылки.
Входной каталог выглядит следующим образом:
.:
total 12
-rw-r--r-- 1 101633 1014 1502 Apr 23 17:21 a.php
drwxr-xr-x 2 101633 1014 6 Apr 23 16:10 empty-directory
-rw-r--r-- 1 101633 1014 0 Apr 23 15:52 emtpy-file
-rw-r--r-- 1 101633 1014 7 Apr 23 15:52 file-w-contents
drwxr-xr-x 2 101633 1014 18 Apr 23 16:39 nonempty-dir
drwxr-xr-x 2 101633 1014 6 Apr 23 15:52 symlink-target-dir
lrwxrwxrwx 1 101633 1014 18 Apr 23 16:12 symlink-to-dir -> symlink-target-dir
lrwxrwxrwx 1 101633 1014 10 Apr 23 16:14 symlink-to-emtpy-file -> emtpy-file
lrwxrwxrwx 1 101633 1014 11 Apr 23 16:25 symlink-to-nonexistent -> nonexistent
./empty-directory:
total 0
./nonempty-dir:
total 0
-rw-r--r-- 1 101633 1014 0 Apr 23 16:39 file
./symlink-target-dir:
total 0
«Официальным» решением для этого является использование Phar, но в нем нет символьные ссылки и пустые каталоги, и выдает исключение для неработающих символических ссылок (похоже, что он хочет следовать им по умолчанию - я не нашел способа отключить это поведение).
$phar = new PharData('output.tar');
$phar->buildFromDirectory("/z");
Результат:
Fatal error: Uncaught RuntimeException: phar error: unable to open file "symlink-to-nonexistent" to add to phar archive in /z/a.php:9
После удаления оборванной символической ссылки создается следующий файл tar:
-rw-r--r-- 0/0 1502 2020-04-23 17:37 a.php
-rw-r--r-- 0/0 0 2020-04-23 17:37 emtpy-file
-rw-r--r-- 0/0 7 2020-04-23 17:37 file-w-contents
-rw-r--r-- 0/0 0 2020-04-23 17:37 nonempty-dir/file
-rwxr-xr-x 0/0 0 2020-04-23 17:37 symlink-target-dir
(Обратите внимание, что пустой 'symlink-target-dir' включен, хотя и не как каталог, а обычный файл .)
Кто-нибудь знает о небольшой автономной библиотеке, способной создать правильный архив tar, включающий все каталоги и ссылки?