我想查找并复制一个文件夹中带有
*.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/
,当文件名相同时,直接重命名即可,怎么办?
我想要的是将所有文件复制到/tempL/,当文件名相同时,只需重命名即可,怎么办?
1)如果你只是不进行覆盖
cp --backup
会给你一个现有文件的备份,使用--suffix
选项cp
,你还可以指定用于备份的后缀。
2)
--parents
的cp
选项将保留目录树,即文件夹1中的文件将复制到新创建的1文件夹中。
3)如果您想自定义重命名处理,则不能仅使用
cp
命令。为其编写脚本并调用它来处理 find
的结果
安装“GNU并行”并使用:
find /tempL/6453/ -name "*.jpg" | parallel 'cp {} ./dest-dir/`stat -c%i {}`_{/}'
{/} ................. gets filename with no full path
我认为 xargs 应该可以采用相同的方法,但是学习并行对我来说是惊人的,它为我们提供了许多漂亮的解决方案。
我建议在
echo
之前使用 cp
来测试您的命令
下面是一个经过测试且有效的实现。
型号
#!/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 {} +
谢谢!😘