unix mv --backup=numbered



我试图在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()命令

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

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}~)$/21/g'`
done
}

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

解释:

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

最后一部分$1/`echo "$y" | sed 's/(.[^~]{3})(.~[0-9]{1,2}~)$/21/g'当然是交换两个括号组的目标文件。/21/

如果你想保留原始文件,只是创建一个副本,那么使用cp而不是mv

如果你想创建一个备份存档,那么对文件夹执行如下的tar gzip命令

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

rsync --ignore-existing --remove-source-files /path/to/source /path/to/dest

使用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

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

既然你说使用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 "{}"'

这个解决方案可能在这种情况下有效

cp --backup=simple src dst

cp --backup=numbered src dst

也可以指定后缀

最新更新