Linux 查找同名文件并将其复制到目标文件夹而不覆盖

问题描述 投票:0回答:3

我想查找并复制一个文件夹中带有

*.jpg
的所有文件(包括其子文件夹)到另一个文件夹 我用

find /tempL/6453/ -name "*.jpg" |  xargs  -I  '{}' cp {} /tempL/;

但它会覆盖同名文件

例如在

/tempL/6453/
中,有
test (1).jpg
test (2).jpg
和文件夹 1,在
/tempL/6453/1/
中,也有同名文件
test (1).jpg
test (2).jpg

如果我使用上面的命令,

test (1).jpg
中只有两个文件
test (2).jpg
/tempL/
,无法将所有文件复制到
/tempL/

我想要的是把所有文件复制到

/tempL/
,当文件名相同时,直接重命名即可,怎么办?

linux find cp
3个回答
6
投票

我想要的是将所有文件复制到/tempL/,当文件名相同时,只需重命名即可,怎么办?

1)如果你只是不进行覆盖

cp --backup
会给你一个现有文件的备份,使用
--suffix
选项
cp
,你还可以指定用于备份的后缀。

2)

--parents
cp
选项将保留目录树,即文件夹1中的文件将复制到新创建的1文件夹中。

3)如果您想自定义重命名处理,则不能仅使用

cp
命令。为其编写脚本并调用它来处理
find

的结果

2
投票

安装“GNU并行”并使用:

find /tempL/6453/ -name "*.jpg" | parallel 'cp {} ./dest-dir/`stat -c%i {}`_{/}'

{/}  ................. gets filename with no full path

我认为 xargs 应该可以采用相同的方法,但是学习并行对我来说是惊人的,它为我们提供了许多漂亮的解决方案。

我建议在

echo
之前使用
cp
来测试您的命令


0
投票

下面是一个经过测试且有效的实现。


型号

#!/bin/bash

find "<SOME_FOLDER_PATH>" -type f "<SOME_FIND_ARG>" -exec sh -c '
    DESTINATION_DIR="<SOME_DESTINY_FOLDER>"
    for FOUND_FILE do
        BASE_NAME=$(basename "$FOUND_FILE")
        if [ -f "$DESTINATION_DIR/$BASE_NAME" ]; then
            cp "$FOUND_FILE" "$DESTINATION_DIR/$BASE_NAME-$(uuidgen | cut -d "-" -f 2)"
        else
            cp "$FOUND_FILE" "$DESTINATION_DIR/$BASE_NAME"
        fi
    done
' bash {} +

示例

#!/bin/bash

find "/some/folder/path/" -type f -iname "*some_find_arg*" -exec sh -c '
    DESTINATION_DIR="/some/destiny/folder"
    for FOUND_FILE do
        BASE_NAME=$(basename "$FOUND_FILE")
        if [ -f "$DESTINATION_DIR/$BASE_NAME" ]; then
            cp "$FOUND_FILE" "$DESTINATION_DIR/$BASE_NAME-$(uuidgen | cut -d "-" -f 2)"
        else
            cp "$FOUND_FILE" "$DESTINATION_DIR/$BASE_NAME"
        fi
    done
' bash {} +

谢谢!😘

© www.soinside.com 2019 - 2024. All rights reserved.