いくつかのファイルを含むいくつかのディレクトリがあります。
/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
ますか?
いくつかのファイルを含むいくつかのディレクトリがあります。
/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
ますか?
$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 をフル パス (末尾にスラッシュを付けない) にすることも忘れないでください。
少し大雑把かもしれませんが、Linux システムを使用している場合は、次のようにすることができます (正しいディレクトリにいると仮定します)。
<?php shell_exec('rm $(ls * | grep -v '.$fileYouWantToKeep.')'); ?>
ただし、ユーザー入力が含まれている場合は、明らかにその変数をフィルタリングする必要があります。
8 年前、私はこの簡単なハックを書いて受け入れられましたが、それを考慮してください。
rm
とmv
削除および移動シェル コマンドに依存するため、UNIX のようなシステムでのみ動作します。shell_exec
も簡単ではありません。これは、execやsystemなどの代替手段でできるように終了コードを取得しないためです) 。ただし、単一のシェルコマンドですべての削除を実行できるという利点があり、処理されたファイルごとに追加の除外ルックアップを必要としないため、パフォーマンスが求められている場合は、高い削除対保存比率で非常に高速に実行されます。
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');
}
とにかく、ここを見ると、リンク解除ベースのソリューションを提案する他のいくつかの回答が私の後に追加されました。これは(以下のコメントで説明されているように)はるかに優れたアプローチです。
unlink
ファイルが使用中の場合、またはスクリプト実行ユーザーがファイルの変更を許可されていない場合に、アクセス許可の問題で既存のファイルの削除に失敗する可能性があるため、エラー処理を追加します。
知らないうちに長いファイル リストを処理するスクリプトを実行する前に、常にini_get('
max_execution_time');
を使用してスクリプト実行のタイムアウト設定を確認してください (必要に応じてset_time_limitを使用してスクリプトのタイムアウト設定を延長することを検討してください)。
別のオプションは次のとおりです。
<?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);
}
}
}
?>
現在、サーバーにアクセスできないため、テストしていませんが、動作するはずです。最初にいくつかのテスト ディレクトリで試して、動作するかどうかを確認してください。
ファイルを一時フォルダーに移動してから、フォルダーを消去し、新しいファンを作成して古いフォルダーの名前のフォルダーを移動し、写真を元に戻し、tmp フォルダーを消去します。$ 利益 $