PHP Script To Copy Files Recursively With Options
This script will help you copy files and folders from one location to another, recursively.
For each file or folder you can have copy options.
Here is an example conf file :
:: GitHub File ::
[/etc/php/cacert.pem]
keep_existing = 1
[/etc/nginx/nginx.conf]
keep_existing = 0
backup = 1
[/etc/nginx/sites-available/default]
keep_existing = 0
backup = 1
[/etc/nginx]
keep_existing = 1
[/home/default]
keep_existing = 1
In this example, the file data/etc/nginx/sites-available/default will be copied to /etc/nginx/sites-available/default, and if the file already exists it will be backuped and overwritten.
In the same way, all the files inside data/etc/nginx will be copied to /etc/nginx, but existing file will be ignored.
How To
Place folders and files that you want to copy in data/
Edit filecopier-config.ini to configure which files and folders you want to copy, backup and overwrite
Command Lines :
php filecopier.php process_all [options]
This command will execute every entries in the filecopier-config.ini file
Config file options :
option | values | default | description |
---|---|---|---|
keep_existing | 1/0 | 0 | keep file if already exists, do not overwrite it |
backup | 1/0 | 0 | create a backup of the file if exists, then copy the new file |
debug | 1/0 | 0 | write the copy in a test/ folder |
php confeditor.php process filepath [options]
This command will copy the file located in data/filepath to filepath
Cmd options :
option | equivalent | values | default |
---|---|---|---|
-ke | keep_existing | 1/0 | 0 |
-b | backup | 1/0 | 0 |
-d | debug | 1/0 | 0 |
PHP Script
:: GitHub File ::
<?php
if(count($argv) >= 2 )
{
if($argv[1] == 'process' && count($argv) >= 4 )
{
process($argv[2], $argv[3]);
}
else if($argv[1] == 'process-all' )
{
$config = parse_ini('confeditor-config.ini',false,false);
//print_r($config);
//exit();
foreach($config as $k=>$v)
{
$AddEdit = $k;
$original = $v['original'];
process($k, $original, $v);
}
}
}
function process( $editFileName, $originalFile, $config = null )
{
global $argv;
// gettings extra params
$keepComments = getSetting( $config, $argv, 'keep_comments', '-kc', false, false);
$keepEmptyLines = getSetting( $config, $argv, 'keep_empty_lines', '-kel', false, false);
$sort = getSetting( $config, $argv, 'sort', '-sort', false, false);
$debug = getSetting( $config, $argv, 'debug', '-d', false, false);
$separator = getSetting( $config, $argv, 'separator', '-sep', true, '=');
$commentRegex = getSetting( $config, $argv, 'comment_regex', '-cr', true, '-^(;|#)-');
$separator = str_replace('"', '', $separator);
$commentRegex = str_replace('"', '',$commentRegex);
//exit( '$keepComments '.$keepComments. ' $keepEmptyLines '.$keepEmptyLines. ' $sort '.$sort.' $separator '.$separator.' $commentRegex '.$commentRegex.' $debug '.$debug);
$editFile = './data/'.$editFileName;
if(!file_exists($editFile))
die( "editFile does not exist ".$editFile);
if(!file_exists($originalFile))
die( "originalFile does not exist ".$originalFile);
$to = $debug ? $originalFile.'-new.ini' : $originalFile;
backup_file($originalFile);
$ini = parse_ini($originalFile, $keepComments, $keepEmptyLines, $separator, $commentRegex );
$iniNewValues = parse_ini($editFile, false, false);
$iniEdited = edit_ini($ini, $iniNewValues, $sort);
save_ini($to, $iniEdited);
//print_r($config);
print_r($ini);
print_r($iniNewValues);
print_r($iniEdited);
//$ini2 = parse_ini($file2, true);
//print_r($ini2);
}
function getSetting( $config, $argv, $varName, $argName, $keepNextArg, $default)
{
if(!empty($config) && isset($config[$varName]))
return $config[$varName];
if(!empty($argv) && !empty($argName) )
{
if(in_array($argName, $argv) )
return $keepNextArg ? $argv[ array_search($argName, $argv) + 1 ] : true;
}
return $default;
}
function backup_file ($file)
{
//echo $file.'.bak';
if(!copy( $file, $file.'.bak'))
//if(!file_put_contents( $file.'.bak', file_get_contents( $file)))
exit("la création du backup a échoué");
}
function edit_ini ( $ini, $iniNewValues, $sort = false )
{
$ini = array_replace_recursive( $ini, $iniNewValues );
$globals = [];
$sections = [];
foreach( $ini as $k=>$v)
{
if(is_array($v)) //section
$sections[$k] = $v;
else
$globals[$k] = $v;
}
if($sort)
{
ksort($globals);
//print_r($globals);
foreach($sections as $k => $v)
{
ksort($v);
$sections[$k] = $v;
//print_r($sections[$k]);
}
}
return $globals + $sections;
}
function save_ini ( $filepath, $ini, $save = true )
{
$str = '';
foreach( $ini as $k=>$v)
{
if(is_array($v)) //section
{
$str .= "[$k]".PHP_EOL;
$str .= save_ini( '', $v, false);
}else
{
if( preg_match('#^comment#', $k ))
$str .= $v.PHP_EOL;
else if( preg_match('#^empty#', $k ))
$str .= PHP_EOL;
else
$str .= "$k = $v".PHP_EOL;
}
}
if($save)
file_put_contents($filepath, $str );
else
return $str;
}
function parse_ini ( $filepath, $keepComments = true, $keepEmptyLines = true, $separator = '=', $commentRegex = '-^(;|#)-' )
{
$ini = file( $filepath );
if ( count( $ini ) == 0 ) { return array(); }
$sections = array();
$values = array();
$globals = array();
$result = array();
$i = 0;
$j = 0;
foreach( $ini as $line ){
$line = trim( $line );
// Sections
if ( !empty($line) && $line{0} == '[' ) {
$sections[] = substr( $line, 1, -1 );
$i++;
continue;
}
// Key-value pair
if ( $line == '' )
{
if($keepEmptyLines)
{
$key = 'empty'.$j++;
$value = $line;
//echo $value;
}
else
continue;
}else if ( preg_match($commentRegex, $line) )
{
if($keepComments )
{
$key = 'comment'.$j++;
$value = $line;
//echo $value
}else
continue;
}else if( preg_match( '#'.$separator.'#', $line)){
list( $key, $value ) = explode( $separator, $line, 2 );
}
$key = trim( $key );
$value = trim( $value );
if ( $i == 0 ) {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$globals[ $key ][] = $value;
} else {
$globals[ $key ] = $value;
}
} else {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$values[ $i - 1 ][ $key ][] = $value;
} else {
$values[ $i - 1 ][ $key ] = $value;
}
}
}
for( $j=0; $j<$i; $j++ ) {
$result[ $sections[ $j ] ] = $values[ $j ];
}
return $globals + $result;
}
?>
The full repository is here : https://github.com/anthonykozak/iniTools