【发布时间】:2020-08-07 00:41:50
【问题描述】:
我想要一个简单的 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 存档,包括所有目录和链接?
【问题讨论】:
-
您是否尝试过Follow Symlinks 选项或using a custom iterator?检查这个如何include empty directories。
-
@msg 我无法手动添加空目录,因为 phar->addEmptyDir() 需要将 phar.readonly 设置为 0,这是我无法做到的(此脚本应在任何环境中工作,无论PHP 设置)。 Re:links,我在 Phar 中没有看到任何添加符号链接的方法,所以我不知道自定义迭代器将如何帮助我。