PHP 文件 目录的递归备份,删除主目录



函数:

function scandir_recursive($dir) {
    $items = scandir($dir);
    foreach($items as $item) {
        if ($item == '.' || $item == '..') {
            continue;
        }
        $file = $dir . '/' . $item;
        echo "$file<br />";
        if (is_dir($file)) {
            scandir_recursive($file);
        }
    }
}
scandir_recursive($path);

输出:

EEAOC/EN/1001/data
EEAOC/EN/1001/data/New Text Document.txt
EEAOC/EN/1001/data/troll.txt
EEAOC/EN/1002/data
EEAOC/EN/1002/data/New Text Document.txt
EEAOC/EN/1002/data/troll.txt
EEAOC/EN/1003/data
EEAOC/EN/1003/data/New Text Document.txt
EEAOC/EN/1003/data/troll.txt
EEAOC/EN/1004/data
EEAOC/EN/1004/data/New Text Document.txt
EEAOC/EN/1004/data/troll.txt

是否可以删除这些空目录并保留文件?此类删除EEAOC/EN/1001/data &EEAOC/EN/1002/data& EEAOC/EN/1003/data &EEAOC/EN/1004/data

我想继续保持如何?

如函数输出所示,目录不为空。

我想数据价值低,只需要备份。我假设您从选择斜杠而不是反斜杠来运行 Linux。 自然,目录会产生带有元数据的链接或索引节点,在 linux 中可以通过

df -hi 

文件的 Inode-Id 可以通过 ls 的 -i 标志显示

ls -i filename
ls -iltr
ls -ltri `echo $HOME`

索引节点占用空间,并在文件系统操作中引入开销。删除目录的动机就这么多。

PHP 删除目录的rmdir函数需要The directory must be empty, and the relevant permissions must permit this .它也是非递归的。

  • 方法 1:平展文件名并将文件移动到备份目录,然后删除空目录
  • 方法 2:以增量方式存档并删除目录

#Approach 1
您的选择应取决于文件访问的难易程度和频率。

函数 scandir_recursive($dir) { $items = 斯堪迪尔($dir);

foreach($items as $item) {
    if ($item == '.' || $item == '..') {
        continue;
    }
    $file = $dir . '/' . $item;
    $fnameflat = $dir . '_' . $item;
    echo "$file<br />n";
    if (is_dir($file)) {
        scandir_recursive($file);
    }
    if(is_file($file)){
        rename($file, '~/backup/'.$fnameflat);
    }
}

} scandir_recursive($path);

之后使用SeniorDev的此功能取消链接文件和目录,或运行

`exec("rmdir -rf $path")`

不建议这样做。

#Approach 2

使用 exec("tar -cvzf backup".date().".tar.gz $path"); 或 php 存档目录。

然后删除目录,如 #1 中所述。

最新更新