php - unix mv --backup=编号

标签 php unix file-io filesystems file-extension

我正在尝试在 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/

相关文章:

php - php 中的 chmod 777

php - AFNetworking 2.0 POST 问题,Cocoa 错误 3840(JSON 文本没有以数组开头...)

php - 我正在尝试使用 codeigniter 设置 microsoft azure 存储访问。它不工作

c - 在 Unix/Linux 上用 C 动态确定终端高度的最佳方法是什么?

php - 将多行linux发送到PHP exec()

使用子进程的python脚本,将所有输出重定向到文件

php - 如何使用内部连接从 codeigniter 中的两个表中获取数据

linux - 什么时候发生套接字超时? (Unix)

c++ - 读取文件直到空行

android - 删除的布局资源仍然存在于 R.java 中