我正在尝试在 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() 命令。
最佳答案
对于这个问题,我在下面的这个函数中使用 sed 来查找和交换这些扩展(将我的目标目录作为参数传递):
swap_file_extension_and_backup_number ()
{
IFS=$'\n'
for y in $(ls $1)
do
mv $1/`echo $y | sed 's/ /\\ /g'` $1/`echo "$y" | sed 's/\(\.[^~]\{3\}\)\(\.~[0-9]\{1,2\}~\)$/\2\1/g'`
done
}
该函数假设您的文件扩展名是正常的 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/
关于php - unix mv --backup=编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529779/