PHP将文件复制/发送到正确的文件夹中

PHP将文件复制/发送到正确的文件夹中,php,regex,Php,Regex,我有很多文件的名称如下: TRK#112工作日#5来自#BOB#UUUU Tender#U P582895zdf112 TRK#WeekDay#5来自#BOB#Uuuu Tender#p58895ZDF152 TRK#115工作日#5来自#BOB#UUUU Tender#U P582895zdf714 我想将每个文件发送到它自己的文件夹 例如: TRK#112工作日#5来自#BOB#uu Tender(招标人)P582895zdf112 会进入112号文件夹 而且 TRK#平日#5 From#

我有很多文件的名称如下:


TRK#112工作日#5来自#BOB#UUUU Tender#U P582895zdf112
TRK#WeekDay#5来自#BOB#Uuuu Tender#p58895ZDF152
TRK#115工作日#5来自#BOB#UUUU Tender#U P582895zdf714

我想将每个文件发送到它自己的文件夹

例如:

TRK#112工作日#5来自#BOB#uu Tender(招标人)P582895zdf112
会进入112号文件夹

而且

TRK#平日#5 From#BOB#uuuuu Tender(p58895zdf152)
不会去任何地方,因为TRK#是空的/缺失的或它不是一个数字。如果不是数字,跳过它

TRK#115 WeekDay#5来自#BOB#uuuuu Tender(up582895zdf714)
将进入文件夹115

您可以使用来提取数字,然后您可以使用来制作实际的文件系统副本:

function doCopy($file) {
    preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
    if (empty($matches[1])) { // no number, skip it
        return false;
    }
    $folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
    if (! is_dir($folder)) { // target directory doesn't exist: make it
        mkdir($folder);
    }
    $target = $folder . DIRECTORY_SEPARATOR . basename($file);
    echo "Copying '$file' into '$target'" . PHP_EOL;
    return copy($file, $target); // actually copy now
}
然后,使用此函数对文件进行循环,结果如下:

$files = [
    'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112',
    'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152',
    'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714',
];

foreach ($files as $file) {
    $copied = doCopy($file);
    if (! $copied) {
        echo "Did not copy $file" . PHP_EOL;
    }
}
“魔力”在正则表达式中,表示匹配:

  • 文本字符串“TRK”
  • 后跟任意数量的空格
  • 后跟文字字符串“#”
  • 后跟任意数量的空格
  • 后跟任意数量的数字——同时捕获匹配的数字
  • 然后,我们检查是否有匹配的数字-
    empty
    test-,并将其复制到一个名为匹配值的目录中。我们在玩杂耍时必须小心。首先,目标目录必须存在。其次,我们需要确保
    copy
    可以在适当的目录中找到原始文件,并为其指定一个包含文件名的目标。超过一半的逻辑都用于此开销


    在Linux计算机上运行的示例:

    $ mkdir test
    $ touch test/'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
    $ touch test/'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf'
    $ touch test/'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
    $ cat example.php
    <?php
    
    function doCopy($file) {
        preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
        if (empty($matches[1])) {
            return false;
        }
        $folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
        if (! is_dir($folder)) {
            mkdir($folder);
        }
        $target = $folder . DIRECTORY_SEPARATOR . basename($file);
            echo "Copying '$file' into '$target'" . PHP_EOL;
        return copy($file, $target);
    }
    
    $files = glob('test/*.pdf');
    foreach ($files as $file) {
        $copied = doCopy($file);
        if (! $copied) {
            echo "Did not copy $file" . PHP_EOL;
        }
    }
    $ php example.php
    Copying 'test/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf' into 'test/112/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
    Copying 'test/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf' into 'test/115/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
    Did not copy test/TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf
    $ tree test/
    test/
    ├── 112
    │   └── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
    ├── 115
    │   └── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
    ├── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
    ├── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
    └── TRK#\ WeekDay#\ 5\ From#\ BOB___Tender_P588895zdf152.pdf
    
    $mkdir测试
    $touch test/'TRK#112工作日#5来自"BOB"Tender"P582895zdf112.pdf"
    $touch test/'TRK#平日#5来自#BOB#uuuu Tender_p58895ZDF152.pdf'
    $touch test/'TRK#115个工作日#5来自#BOB#uuuu Tender(P582895zdf714.pdf)
    $cat example.php
    您可以使用提取数字,然后使用创建实际的文件系统副本:

    function doCopy($file) {
        preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
        if (empty($matches[1])) { // no number, skip it
            return false;
        }
        $folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
        if (! is_dir($folder)) { // target directory doesn't exist: make it
            mkdir($folder);
        }
        $target = $folder . DIRECTORY_SEPARATOR . basename($file);
        echo "Copying '$file' into '$target'" . PHP_EOL;
        return copy($file, $target); // actually copy now
    }
    
    然后,使用此函数对文件进行循环,结果如下:

    $files = [
        'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112',
        'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152',
        'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714',
    ];
    
    foreach ($files as $file) {
        $copied = doCopy($file);
        if (! $copied) {
            echo "Did not copy $file" . PHP_EOL;
        }
    }
    
    “魔力”在正则表达式中,表示匹配:

  • 文本字符串“TRK”
  • 后跟任意数量的空格
  • 后跟文字字符串“#”
  • 后跟任意数量的空格
  • 后跟任意数量的数字——同时捕获匹配的数字
  • 然后,我们检查是否有匹配的数字-
    empty
    test-,并将其复制到一个名为匹配值的目录中。我们在玩杂耍时必须小心。首先,目标目录必须存在。其次,我们需要确保
    copy
    可以在适当的目录中找到原始文件,并为其指定一个包含文件名的目标。超过一半的逻辑都用于此开销


    在Linux计算机上运行的示例:

    $ mkdir test
    $ touch test/'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
    $ touch test/'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf'
    $ touch test/'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
    $ cat example.php
    <?php
    
    function doCopy($file) {
        preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
        if (empty($matches[1])) {
            return false;
        }
        $folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
        if (! is_dir($folder)) {
            mkdir($folder);
        }
        $target = $folder . DIRECTORY_SEPARATOR . basename($file);
            echo "Copying '$file' into '$target'" . PHP_EOL;
        return copy($file, $target);
    }
    
    $files = glob('test/*.pdf');
    foreach ($files as $file) {
        $copied = doCopy($file);
        if (! $copied) {
            echo "Did not copy $file" . PHP_EOL;
        }
    }
    $ php example.php
    Copying 'test/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf' into 'test/112/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
    Copying 'test/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf' into 'test/115/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
    Did not copy test/TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf
    $ tree test/
    test/
    ├── 112
    │   └── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
    ├── 115
    │   └── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
    ├── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
    ├── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
    └── TRK#\ WeekDay#\ 5\ From#\ BOB___Tender_P588895zdf152.pdf
    
    $mkdir测试
    $touch test/'TRK#112工作日#5来自"BOB"Tender"P582895zdf112.pdf"
    $touch test/'TRK#平日#5来自#BOB#uuuu Tender_p58895ZDF152.pdf'
    $touch test/'TRK#115个工作日#5来自#BOB#uuuu Tender(P582895zdf714.pdf)
    $cat example.php
    
    这将主要是一个正则表达式任务。你对正则表达式了解多少?@Goose谢谢你的时间。bishop也在帮助我,但看起来我们遇到了操作系统问题。我认为他有一个非常有希望的解决方案,但还没有奏效。如果你能看一下,那就太好了!再次感谢。这将主要是一个正则表达式任务。你对正则表达式了解多少?@Goose谢谢你的时间。bishop也在帮助我,但看起来我们遇到了操作系统问题。我认为他有一个非常有希望的解决方案,但还没有奏效。如果你能看一下,那就太好了!再次感谢。