2

ディレクトリ構造からすべてのファイルを削除しようとするphpスクリプトがありますが、すべてをsvnに保持します。私はこのコマンドをオンラインで見つけました。これは、シェルに直接接続すると完全に機能します。

find /my/folder/path/ -path \'*/.svn\' -prune -o -type f -exec rm {} +

残念ながら、次のようにそのコマンドでphpでshell_execを実行すると、次のようになります。

$cmd = 'find $folderPath -path \'*/.svn\' -prune -o -type f -exec rm {} +';
shell_exec($cmd);

次に、phpスクリプトを呼び出す現在のディレクトリ内のすべてのファイルも削除されます。

誰かが理由と、問題を修正してphpスクリプトを修正して期待どおりに動作し、指定されたフォルダー内のファイルのみを削除できるようにする方法を説明できますか?

完全なソースコードを以下に示します。これは、私が見逃したばかげた間違いがあった場合に備えてです。

<?php

# This script simply removes all files from a specified folder, that aren't directories or .svn 
# files. It will see if a folder path was given as a cli parameter, and if not, ask the user if they 
# want to remove the files in their current directory.

$execute = false;

if (isset($argv[1]))
{
    $folderPath = $argv[1];
    $execute = true;
}
else
{
    $folderPath = getcwd();
    $answer = readline("Remove all files but not folders or svn files in $folderPath (y/n)?" . PHP_EOL);

    if ($answer == 'Y' || $answer == 'y')
    {
        $execute = true;
    }
}

if ($execute)
{
    # Strip out the last / if it was given by accident as this can cause deletion of wrong files
    if (substr($folderPath, -1) != '/')
    {
        $folderPath .= "/";
    }

    print "Removing files from $folderPath" . PHP_EOL;
    $cmd = 'find $folderPath -path \'*/.svn\' -prune -o -type f -exec rm {} +';
    shell_exec($cmd);
}
else
{
    print "Ok not bothering." . PHP_EOL;
}

print "Done" . PHP_EOL;

?>
4

2 に答える 2

2

コマンドは問題ないようです。少なくともシェルでは。簡単な方法でPHPの問題を実際にトラブルシューティングする場合

var_dump($cmd);

エラーがどこにあるかがわかります。

$cmd = 'find $folderPath -path \'*/.svn\' -prune -o -type f -exec rm {} +';

よく見てください。ヒント:1ドルで2倍にすることはできません

于 2012-12-24T12:46:47.390 に答える
1

それはすべてに帰着します:

$cmd = 'find $folderPath -path \'*/.svn\' -prune -o -type f -exec rm {} +';
shell_exec($cmd);

一重引用符を使用しているため、変数$folderPathは変更されません。だからあなたは実行しています

find $folderPath -path '*/.svn' -prune -o -type f -exec rm {} +

それ以外の

find /my/folder/path/ -path \'*/.svn\' -prune -o -type f -exec rm {} +

二重引用符を使用するか、$cmd = 'find '.$folderPath.' -path \'*/.svn\' -prune -o -type f -exec rm {} +';

于 2012-12-24T12:47:28.893 に答える