linux - 使用新文件名从多个目录复制多个文件
问题描述
我想制作一个特定的副本。我解释
所以这里是我的主文件夹:
Sub-Directory-name-01\filename-01.jpg
Sub-Directory-name-01\filename-02.jpg
Sub-Directory-name-01\filename-03.jpg
Sub-Directory-name-01\special-filename-01.jpg
Sub-Directory-name-02\filename2-01.jpg
Sub-Directory-name-02\filename2-02.jpg
Sub-Directory-name-02\filename2-03.jpg
Sub-Directory-name-02\special-filename2-01.jpg
Sub-Directory-name-02\filename2-01.jpg
Sub-Directory-name-02\filename2-02.jpg
Sub-Directory-name-02\filename2-03.jpg
Sub-Directory-name-02\special-filename2-01.jpg
我想从所有目录复制所有文件,并且:
- 保留原始文件
- 复制原始文件的 2 倍
- 为新名称添加前缀
- 第一个副本的前缀 01
- 第二个副本的前缀 02
- 保留新文件与原始文件相同的目录
我已经成功使用命令复制 1 次,前缀为 1。它在子目录中工作
for file in *.jpg; do cp "$file" "prefix-$file"; done
我尝试为所有子目录做,但出现错误
find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg" \) | xargs cp -v "$file" "prefix-$file"
(是的,我排除了一个特殊的名字)
但我得到了错误:
cp: target `./Sub-Directory-name-01/filename-01.jpg' is not a directory
我不知道如何解决我的问题以及如何在 cmd 中添加第二个副本。
谢谢
编辑:我还没有发现任何类似的问题,所以任何答案都可以解决这个问题。
解决方案
请注意,上面仅由循环$file
设置,即在您的命令行中,您只是使用循环中的最后一个剩余值。for file in ... ; do ... ;done
xargs
需要考虑的一些事项:
需要分别处理每个文件 => 使用
xargs -l1
(处理每 1 行)。需要分开
DIR/FILENAME
,因为所需的命令类似于 'cp $DIR/$FILENAME $DIR/prefix-01-$FILENAME' (还有前缀 02),find ... -printf "%h %f\n"
用于此对于每一行,需要做几件事(prefix-01,02)=> 使用scriptlet via
sh -c '<scriptlet>'
更好地跳过
prefix-0?-*.jpg
文件find
,以便能够在不“累积”副本的情况下重新运行它
一个可能的实现是:
find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg" ! -name "prefix-0?-*.jpg" \) -printf "%h %f\n" | \
xargs -l1 sh -c 'cp -v "$1/$2" "$1/prefix-01-$2"; cp -v "$1/$2" "$1/prefix-02-$2"' --
作为每一行的xargs
运行, scriptlet将分别正确评估和。sh -c '<scriptlet>' -- DIR FILE
$1
$2
--jjo
PS:类 Unix 系统中的目录分隔符是/
:)
[更新:固定使用,%f
而不是%P
,根据下面的评论]
推荐阅读
- php - 如何使用 PHP 格式化包含数据库中时间的变量?
- r - ggplot2 热图没有均匀地分布在背景主题上
- swift - Swift 浮点计算不同于其他语言
- python - 如何在异步 Python 函数中指定返回类型?
- spring - Spring Boot 测试:等待微服务调度器任务
- javascript - 如何在 javascript/Ajax 中添加重试
- node.js - 使用 mongoDB 客户端连接 mongoDB 时遇到问题
- c# - 使用 Dapper 映射多个复杂类型属性
- sql - Number of records created per day
- c# - 用于获取出现次数超过 1 的列表的 LINQ