deleting all files in except the one running the delete code

后端 未结 2 755
一生所求
一生所求 2021-01-26 03:51

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:



        
相关标签:
2条回答
  • 2021-01-26 04:09

    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/*"));
    
    0 讨论(0)
  • 2021-01-26 04:25

    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();
    ?>
    
    0 讨论(0)
提交回复
热议问题