8

我正在尝试在 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)......但不会破坏文件的扩展名。有任何想法吗?请。

ps 必须使用 system() 命令。

4

6 回答 6

1

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

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/

于 2020-05-22T11:58:48.747 回答
0

如果您想保留原始文件并仅创建一个副本,请使用cpnot mv

如果要创建备份存档,请像这样对文件夹执行 tar gzip

tar -pczf name_of_your_archive.tar.gz /path/to/directory/to/backup

于 2013-03-20T16:57:04.203 回答
0

rsync--backup--backup-dir选项一起使用。例如:

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

于 2013-03-20T17:10:34.907 回答
0
rsync --ignore-existing --remove-source-files /path/to/source /path/to/dest
于 2013-03-20T17:01:53.910 回答
0

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

既然您说使用 php 复制文件很复杂,也许您可​​以像现在一样做,以格式获取文件

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

然后使用 PHP 解析文件并将它们重命名为您想要的格式。这样您就不必处理权限和重复文件,这是您提到的复杂情况。您只需要查找具有这种格式的文件,然后重命名它们。

于 2013-03-20T18:24:32.440 回答
0

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

这是我的黑客!

与文件一起使用:

#!/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 "{}"'
于 2017-11-17T19:51:13.220 回答