6

いくつかのファイルを含むいくつかのディレクトリがあります。

/test1/123.jpg
/test1/124.jpg
/test1/125.jpg
/test2/123.jpg
/test2/124.jpg

/test1/124.jpg or /test2/124.jpg?以外をすべて削除したい

ディレクトリ名とファイル名はわかっています。php を使用して Linux 環境でそれを行う方法はありunlinkますか?

4

5 に答える 5

33

$dir と $leave_files を編集して、場所とファイルを編集します。

$dir = 'test1';
$leave_files = array('124.jpg', '123.png');

foreach( glob("$dir/*") as $file ) {
    if( !in_array(basename($file), $leave_files) ){
        unlink($file);
    }
}

ディレクトリごとに1回実行します。

また、ターゲット ディレクトリがこのスクリプトと同じフォルダーにない場合は、$dir をフル パス (末尾にスラッシュを付けない) にすることも忘れないでください。

于 2012-08-10T23:34:42.127 に答える
3

少し大雑把かもしれませんが、Linux システムを使用している場合は、次のようにすることができます (正しいディレクトリにいると仮定します)。

<?php shell_exec('rm $(ls * | grep -v '.$fileYouWantToKeep.')'); ?>

ただし、ユーザー入力が含まれている場合は、明らかにその変数をフィルタリングする必要があります。

于 2012-08-10T23:33:39.120 に答える
1

8 年前、私はこの簡単なハックを書いて受け入れられましたが、それを考慮してください。

  • プラットフォームに依存します: Unix のようなパスrmmv削除および移動シェル コマンドに依存するため、UNIX のようなシステムでのみ動作します。
  • shell_execを介してシステムシェルコマンドを実行できるようにするには、php構成が必要です(自分が何をしているのかわからない限り、お勧めしません)
  • これは、提案された質問に対する非常にその場しのぎの回答であり、ファイル名の配列に対してforeach反復を使用するほど派手ではなく、より一般的な解決策を可能にします。
  • いかなる種類のエラーキャプチャも実行しないため、スクリプトは失敗しても黙って続行します (エラーのキャプチャshell_execも簡単ではありません。これは、execsystemなどの代替手段でできるように終了コードを取得しないためです) 。

ただし、単一のシェルコマンドですべての削除を実行できるという利点があり、処理されたファイルごとに追加の除外ルックアップを必要としないため、パフォーマンスが求められている場合は、高い削除対保存比率で非常に高速に実行されます。

    for ($i=1;$i<=2;$i++){
        shell_exec ('mv /test'.$i.'/124.jpg /test'.$i.'/keep.jpg');
        shell_exec ('rm /test'.$i.'/12*.jpg');
        shell_exec ('mv /test'.$i.'/keep.jpg /test'.$i.'/124.jpg');
    }

とにかく、ここを見ると、リンク解除ベースのソリューションを提案する他のいくつかの回答が私の後に追加されました。これは(以下のコメントで説明されているように)はるかに優れたアプローチです。

于 2012-08-10T23:31:01.580 に答える
1

別のオプションは次のとおりです。

<?php
$dirList = array('/path/to/dir1','/path/to/dir2'); //List of Dirs with files to be deleted. No trailing slash
$saved = array('path/to/file1','path/to/file2'); //List of files to be saved, no leading slash

foreach($dirList as $directory){
$list = scandir($directory);
foreach($list as $file){
if(!is_int(array_seach($directory.'/'.$file,$saved))){ //Array search returns key if needle exists, so we check if it does not return int
unlink($file);
}
}
}

?>

現在、サーバーにアクセスできないため、テストしていませんが、動作するはずです。最初にいくつかのテスト ディレクトリで試して、動作するかどうかを確認してください。

于 2012-08-10T23:42:41.867 に答える
0

ファイルを一時フォルダーに移動してから、フォルダーを消去し、新しいファンを作成して古いフォルダーの名前のフォルダーを移動し、写真を元に戻し、tmp フォルダーを消去します。$ 利益 $

于 2013-01-05T05:49:11.537 に答える