【问题标题】:unix mv --backup=numberedunix mv --backup=编号
【发布时间】:2020-05-22 20:05:07
【问题描述】:

我正在尝试在 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() 命令。

【问题讨论】:

  • 是的,这很不方便。我的很多脚本都依靠结尾来识别文件类型。

标签: php unix file-io filesystems file-extension


【解决方案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/

【讨论】:

  • 你能给出一个示例文件名来解释吗?尽管我认为这是最好的方法,但我很快就放弃了。
  • 来电是./script path。它会将/path/abc.jpg.~1~ 更改为/path/abc.~1~.jpg。有人可以给我一个指针,如何将输出更改为abc~1~.jpg? --> 后续问题见there
【解决方案2】:

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

如果你想创建一个备份存档,然后像这样对文件夹进行 tar gzip 压缩

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

【讨论】:

  • 这不是问的!在这里我需要移动但不要覆盖原始文件(如果存在),像 --backup 一样制作副本!
  • 这正是您所要求的。你没有移动你正在创建它的副本的文件,我在第一行回答!在您的示例中,您希望将 test 文件夹移动到名为 test2 的文件夹中,这将使您没有 test 文件夹。如果您想将 test 的副本留在原处并在 test2 下创建它的克隆,那么您想使用 cp
  • 你不能在执行命令之前检查文件是否存在吗?那么戴夫的回答就会奏效。
  • 问题中没有存档 tar 如何处理这个问题?
【解决方案3】:
rsync --ignore-existing --remove-source-files /path/to/source /path/to/dest

【讨论】:

  • 用 --remove-source-files 更新
  • 这不起作用!,我用文件和文件夹尝试过,如果文件存在,它就会忽略它。不要在 dest 文件夹中复制源文件,也不要删除源文件。
【解决方案4】:

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

【讨论】:

  • 我不需要备份文件夹,我需要在同一个文件夹中备份。我需要它移动而不是复制!
【解决方案5】:

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

既然你说用php复制文件很复杂,也许你可以用你现在做的方式来做,以格式获取文件

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

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

【讨论】:

  • 这个想法是在工作中提出的,但它的效率太低,无法移动,然后递归它来修复移动
  • @user1725378 这是经常发生的事情吗?从某种意义上说,它不是一步完成的,因此效率低下,但我认为它不会对性能产生太大影响。
  • 服务器所做的一切(将随机文件和文件夹从一个位置移动到另一个位置)。它必须在一次滑动中。
【解决方案6】:

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

这是我的秘诀!

与文件一起使用:

#!/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 "{}"'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多