I want to delete all the files in the public_html directory of my domain by a single command. For this one of SO\'s questions had this answer:
Use something like this:
function delete_all($filename) {
// files listed in this array will not being deleted
$exceptions = array (
'file1',
'file2', ...
);
if(!in_array($filename, $exceptions)) {
unlink($filename);
}
}
// !!! attention !!! this will delete all files except those listed above
// from this folder. Make sure you know what you are doing
array_map('delete_all', glob("path/to/temp/*"));
read the class structure, you will get some useful features
<?php
// this will call your given callback with the file or folder informations, so you can use your logic to delete/copy/move the file/folder
// note: this is a recursive function
$literator = new ipDirLiterator(
"your/path/to/root/or/anyfolder/", // for getting root path, you can use $_SERVER["DOCUMENT_ROOT"]
array(
"file" => function( $file ) { // your callback to delete files
if ( basename( $file["pathname"] ) !== basename( __FILE__ ) ) {
unlink( $file["pathname"] );
}
}
),
true
);
class ipDirLiterator {
protected $basepath = false;
protected $callbacks = false;
protected $checked = array();
public function __construct( $basepath = false, $callbacks = false, $init = false ) {
$this->basepath = ( $basepath ) ? realpath( $basepath ) : false;
$this->callbacks = $callbacks;
if ( $init ) {
$this->literate();
}
}
public function literate( $dir = false ) {
if ( !$this->basepath ) {
return false;
}
if ( $dir === $this->basepath ) {
return false;
}
if ( !$dir ) {
$dir = $this->basepath;
}
$dir = realpath( $dir );
if ( strstr( $dir, basename( $this->basepath ) ) === false ) {
return false;
}
if ( in_array( $dir, $this->checked ) ) {
return false;
}
$this->checked[] = $dir;
$items = new DirectoryIterator( $dir );
foreach( $items as $item ) {
if ( $item->isDot() ) {
if ( $item->getFilename() === ".." ) {
$this->literate( dirname( $item->getPath() ) );
}
$this->callback( "dot", $this->info( $item ) );
continue;
}
if ( $item->isFile() || $item->isLink() ) {
$this->callback( "file", $this->info( $item ) );
}
if ( $item->isDir() && !$item->isLink() ) {
$this->literate( $item->getPathname() );
$this->callback( "dir", $this->info( $item ) );
}
}
}
private function info( $item ) {
$info = array(
"filename" => $item->getFilename(),
"extension" => pathinfo( $item->getFilename(), PATHINFO_EXTENSION ),
"pathname" => $item->getPathname(),
"path" => $item->getPath(),
"readable" => (bool)$item->isReadable(),
"writable" => (bool)$item->isWritable(),
"executable" => (bool)$item->isExecutable(),
"created_on" => $item->getCTime(),
"last access" => $item->getATime(),
"modified_on" => $item->getMTime(),
"inode" => $item->getInode(),
"permissions" => $item->getPerms(),
"is_dir" => (bool)$item->isDir(),
"is_dot" => (bool)$item->isDot(),
"type" => $item->getType(),
"group" => $item->getGroup(),
"owner" => $item->getOwner(),
"size" => $item->getSize()
);
return $info;
}
private function callback( $callback = "file", $args = null ) {
if ( $this->callbacks ) {
if ( isset( $this->callbacks[$callback] ) ) {
call_user_func( $this->callbacks[$callback], $args );
}
}
}
}
?>
Detailed example:
<?php
/**
* It will recursively go through the all directories and files under the directory you have given.
* Here we are going to delete all the files order than 1 hour
**/
/**
* Path to the folder you want to process
**/
$basepath = "any/path/to/files/or/folder/";
/**
* Callbacks
**/
$file_callback = function( $file /* information of current file in the loop */ ) { // your callback for files
$modified_time = filemtime( $file["pathname"] );
$current_time = time();
$time_differnce = ( $current_time - $modified_time );
if ( $time_differnce > 3600 ) {
unlink( $file["pathname"] );
}
};
$folder_callback = function( $file /* information of current folder in the loop */ ) { // your callback for folders
// proceess your folder here
};
/**
* Initialize the class
**/
$literator = new ipDirLiterator( $basepath, array( "file" => $file_callback, "dir" => $folder_callback ) );
$literator->literate();
?>