Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php unix mv--备份=编号_Php_Unix_File Io_Filesystems_File Extension - Fatal编程技术网

Php unix mv--备份=编号

Php unix mv--备份=编号,php,unix,file-io,filesystems,file-extension,Php,Unix,File Io,Filesystems,File Extension,我试图在php中移动一个文件夹,但如果存在重复,则将两个文件都保存在dest文件夹中。 我试着在递归中做到这一点,但它太复杂了,很多事情都可能出错,例如文件前置任务和重复的文件\文件夹 我正在尝试使用system()命令,我不知道如何移动文件,但在不破坏扩展名的情况下保留备份 $last_line = system('mv --backup=t websites/test/ websites/test2/', $retval); 如果两个目录中都存在文件,则提供以下内容: ajax.html~

我试图在php中移动一个文件夹,但如果存在重复,则将两个文件都保存在dest文件夹中。 我试着在递归中做到这一点,但它太复杂了,很多事情都可能出错,例如文件前置任务和重复的文件\文件夹

我正在尝试使用system()命令,我不知道如何移动文件,但在不破坏扩展名的情况下保留备份

$last_line = system('mv --backup=t websites/test/ websites/test2/', $retval);
如果两个目录中都存在文件,则提供以下内容:

ajax.html~
ajax.html~1
ajax.html~2
我要找的是:

ajax~.html
ajax~1.html
ajax~2.html
或任何其他类似(1)、(2)。。。但不会破坏文件的扩展名。 有什么想法吗?求你了


p、 s必须使用system()命令。

如果要保留原始文件并创建副本,请使用
cp
而不是
mv

如果您想创建一个备份档案,那么像这样对文件夹进行tar gzip

tar-pczf name\u您的\u archive.tar.gz/path/to/directory/to/backup
--backup
--backup dir
选项一起使用。例如:

rsync --ignore-existing --remove-source-files /path/to/source /path/to/dest
rsync -a --backup --backup-dir /usr/local/backup/2013/03/20/ /path/to/source /path/to/dest

每次文件可能被覆盖时,它都会被复制到给定的文件夹,以及该项目的路径。例如:
/path/to/dest/path/to/source/file.txt

从外观上看,似乎没有任何内置方法可以在备份文件的同时将扩展名保留在正确的位置。可能是错的,但我找不到一个不符合你原来的问题所指出的

既然你说用php复制文件很复杂,也许你现在可以用同样的方法,以相同的格式复制文件

ajax.html~
ajax.html~1
ajax.html~2

然后使用PHP解析文件并将其重命名为所需的格式。这样,您就不必处理权限和重复文件,这些都是您提到的复杂问题。您只需查找具有此格式的文件,然后重命名它们。

我不是严格回答您的问题,但我在这里介绍的案例非常常见,因此是有效的

这是我的黑客

与文件一起使用:

#!/bin/bash

# It will find all the files according to the arguments in 
# "<YOUR_ARGUMENT_TO_FIND_FILES>" ("find" command) and move them to the 
# "<DEST_FOLDER>" folder. Files with the same name will follow the pattern: 
# "same_name.ext", "same_name (1).ext", "same_name (2).ext", 
# "same_name (3).ext"...

cd <YOUR_TARGET_FOLDER>
mkdir ./<DEST_FOLDER>
find ./ -iname "<YOUR_ARGUMENT_TO_FIND_FILES>" -type f -print0 | xargs -0 -I "{}" sh -c 'cp --backup=numbered "{}" "./<DEST_FOLDER>/" && rm -f "{}"'
cd ./<DEST_FOLDER>
for f_name in *.~*~; do 
    f_bak_ext="${f_name##*.}"
    f_bak_num="${f_bak_ext//[^0-9]/}"
    f_orig_name="${f_name%.*}"
    f_only_name="${f_orig_name%.*}"
    f_only_ext="${f_orig_name##*.}"
    mv "$f_name" "$f_only_name ($f_bak_num).$f_only_ext"
done
cd ..
#!/bin/bash

# It will find all the folders according to the arguments in 
# "<YOUR_ARGUMENT_TO_FIND_FOLDERS>" ("find" command) and move them to the 
# "<DEST_FOLDER>" folder. Folders with the same name will have their contents 
# merged, however files with the same name WILL NOT HAVE DUPLICATES (example: 
# "same_name.ext", "same_name (1).ext", "same_name (2).ext", 
# "same_name (3).ext"...).

cd <YOUR_TARGET_FOLDER>
find ./ -path "./<DEST_FOLDER>" -prune -o -iname "<YOUR_ARGUMENT_TO_FIND_FOLDERS>" -type d -print0 | xargs -0 -I "{}" sh -c 'rsync -a "{}" "./<DEST_FOLDER>/" && rm -rf "{}"'
#/bin/bash
#它将根据中的参数查找所有文件
#“”(“查找”命令)并将其移动到
#“”文件夹。具有相同名称的文件将遵循以下模式:
#“同名.ext”,“同名(1.ext”,“同名(2.ext)”,
#“相同名称(3.ext)”。。。
光盘
mkdir/
find./-iname”“-type f-print0 | xargs-0-I“{}”sh-c'cp--backup=编号为“{}”。//”&&rm-f“{}”
光盘/
对于*~*~*中的f_名称;做
f_bak_ext=“${f_name###*.}”
f_bak_num=“${f_bak_ext/[^0-9]/}”
f_orig_name=“${f_name%.*}”
f_only_name=“${f_orig_name%.*}”
f_only_ext=“${f_orig_name 35;#*.}”
mv“$f_name”“$f_only_name($f_bak_num)。$f_only_ext”
完成
光盘
与文件夹一起使用:

#!/bin/bash

# It will find all the files according to the arguments in 
# "<YOUR_ARGUMENT_TO_FIND_FILES>" ("find" command) and move them to the 
# "<DEST_FOLDER>" folder. Files with the same name will follow the pattern: 
# "same_name.ext", "same_name (1).ext", "same_name (2).ext", 
# "same_name (3).ext"...

cd <YOUR_TARGET_FOLDER>
mkdir ./<DEST_FOLDER>
find ./ -iname "<YOUR_ARGUMENT_TO_FIND_FILES>" -type f -print0 | xargs -0 -I "{}" sh -c 'cp --backup=numbered "{}" "./<DEST_FOLDER>/" && rm -f "{}"'
cd ./<DEST_FOLDER>
for f_name in *.~*~; do 
    f_bak_ext="${f_name##*.}"
    f_bak_num="${f_bak_ext//[^0-9]/}"
    f_orig_name="${f_name%.*}"
    f_only_name="${f_orig_name%.*}"
    f_only_ext="${f_orig_name##*.}"
    mv "$f_name" "$f_only_name ($f_bak_num).$f_only_ext"
done
cd ..
#!/bin/bash

# It will find all the folders according to the arguments in 
# "<YOUR_ARGUMENT_TO_FIND_FOLDERS>" ("find" command) and move them to the 
# "<DEST_FOLDER>" folder. Folders with the same name will have their contents 
# merged, however files with the same name WILL NOT HAVE DUPLICATES (example: 
# "same_name.ext", "same_name (1).ext", "same_name (2).ext", 
# "same_name (3).ext"...).

cd <YOUR_TARGET_FOLDER>
find ./ -path "./<DEST_FOLDER>" -prune -o -iname "<YOUR_ARGUMENT_TO_FIND_FOLDERS>" -type d -print0 | xargs -0 -I "{}" sh -c 'rsync -a "{}" "./<DEST_FOLDER>/" && rm -rf "{}"'
#/bin/bash
#它将根据中的参数查找所有文件夹
#“”(“查找”命令)并将其移动到
#“”文件夹。同名文件夹将包含其内容
#但是,具有相同名称的合并文件将不会有重复项(例如:
#“同名.ext”,“同名(1.ext”,“同名(2.ext)”,
#“相同名称(3.ext)…”。
光盘
find./-path“/”-prune-o-iname”“-type d-print0 | xargs-0-I{}”sh-c'rsync-a{}”。/“&&rm-rf{}”

对于这个问题,我让sed在下面这个函数中找到并交换这些扩展(将我的目标目录作为参数传递):

该函数假定您的文件扩展名为正常的3个字符长,这将查找最多两位数的备份,即
~99~

说明:

这部分
$1/`echo$y | sed's/\\\/g'`1/`echo$y'
表示
mv
的第一个参数(原始文件),但通过添加转义保护您不受空格字符的影响


最后一部分
$1/`echo“$y”| sed's/\(\.[^~]\{3\}\(\.[0-9]\{1,2\}\)$/\2\1/g'
当然是交换两个附加组的目标文件<代码>/\2\1/

这不是问题所在!在这里,我需要移动,但不要覆盖原始文件(如果存在),复制一个副本,备份就是这样做的!这正是你要求的。你不是在移动文件,而是在创建一个副本,我在第一行回答!在您的示例中,您希望将测试文件夹移动到一个名为test2的文件夹中,这样您就没有测试文件夹了。如果您想保留test的一个副本,并在test2下创建它的克隆,那么您想使用cpc,您不能在执行命令之前检查文件是否存在吗?那么Dave的答案就行了。问题中没有存档tar是如何处理的?更新为--删除源文件这不起作用!,我用文件和文件夹尝试了它,如果文件存在,它就会忽略它。不在dest文件夹中复制源文件,也不删除源文件。我不需要备份文件夹,我需要在同一文件夹中进行备份。我需要的是移动而不是复制!这个想法是在工作中提出的,但它太低效了,无法移动,然后再重复使用它来修复问题move@user1725378这是一件非常频繁的事情吗?它的效率很低,因为它不是一步到位的,但我认为它不会对性能产生太大影响。这是服务器的全部功能(将随机文件和文件夹从一个位置移动到另一个位置)。一定是一次刷卡。是的,这很不方便。我的很多脚本都依赖结尾来识别文件类型。你能给出一个示例文件名来解释吗?我很快就放弃了,尽管我认为这是最好的方法。