删除文件名中含有特殊字符的文件

发布于 2024-10-09 18:47:48 字数 207 浏览 8 评论 0原文

我需要删除文件名中含有特殊字符的旧文件,例如空格、(,)! 和通过 PHP 等等。经典的 unlink($filename) 不适用于这些文件。如何将文件名转换为接受取消链接函数和文件系统的文件名?它在 Solaris 计算机上运行,​​我无法通过其他方式访问它。

I need to delete old files with special characters in filenames like space,,,(,),! and so on via PHP. Classic unlink($filename) does not work for these files. How can I transform filenames to filenames which accepts unlink function and filesystem? It's running on a Solaris machine and I don't have another access to it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

眼泪淡了忧伤 2024-10-16 18:47:48

您如何构建$filename?如果您对其进行正常转义,则 unlink 应该适用于任何带有特殊字符的文件名。例如,

对于名称为的文件,其中包含各种/奇怪的字符,那么

 $filename = 'this has\, various\/wonky \!characters in it';
 unlink($filename);

应该可以工作。

How are you constructing the $filename? unlink should work on any filename with special characters if you do the normal escaping on it. e.g.

for a file with a name of this has, various/wonky !characters in it, then

 $filename = 'this has\, various\/wonky \!characters in it';
 unlink($filename);

should work.

旧伤还要旧人安 2024-10-16 18:47:48

unlink 接受任何有效字符串,并尝试删除该字符串中的文件。

unlink('/home/user1/"hello(!,');

也许您没有正确转义某些字符。

unlink accepts any valid string and will try to delete the file in that string.

unlink('/home/user1/"hello(!,');

Perhaps you are not properly escaping certain characters.

怪我闹别瞎闹 2024-10-16 18:47:48

您还可以使用 RegexIterator 查找所有需要的文件并取消链接它们:

<?php

$dir  = new RecursiveDirectoryIterator('.');
$iterator = new RecursiveIteratorIterator($dir);
$regex = new RegexIterator($iterator, '/(^.*[\s\.\,\(\)\!]+.*)/', RecursiveRegexIterator::GET_MATCH);

foreach ($regex as $file) {
        if (is_file($file[0])) {
                print "Unlink file {$file[0]}\n";
                unlink($file[0]);
        }
}

此代码片段递归遍历当前 ('.') 中的所有目录,并通过正则表达式 '/(^.[\s\,.()! ]+.)/',然后删除它们。

You can also find all needed files and unlink them using RegexIterator:

<?php

$dir  = new RecursiveDirectoryIterator('.');
$iterator = new RecursiveIteratorIterator($dir);
$regex = new RegexIterator($iterator, '/(^.*[\s\.\,\(\)\!]+.*)/', RecursiveRegexIterator::GET_MATCH);

foreach ($regex as $file) {
        if (is_file($file[0])) {
                print "Unlink file {$file[0]}\n";
                unlink($file[0]);
        }
}

This code snippet recursively traverse all directories from current ('.') and matches all files by regex '/(^.[\s\,.()!]+.)/', then delete them.

橘味果▽酱 2024-10-16 18:47:48

我在 Linux 中的做法是使用绝对路径,例如“rm ./filename”,即点斜杠。

您还可以使用转义字符。就像“rm \-filename”一样,即 - backspash 连字符。

The way I do it in Linux is to use absolute paths, like "rm ./filename" that is dot slash.

You can also use escape charachters. Like "rm \-filename" that is - backspash hyphen.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文