这是文件夹结构:
/home/user/图片/假期/意大利/罗马/照片。正面.001.jpg
在罗马文件夹中,我还有许多其他照片,但我只对那些具有“正面“在文件名中。我应该复制这些文件并将其命名为”同人画.jpg“(仍在罗马文件夹中)。
我想对意大利父文件夹中存储的所有文件夹执行此操作。
我一直试图用来find
搜索这些图片,但后来我无法使用不同的名称进行复制。
您知道如何解决这个问题吗?
答案1
您应该能够使用-execdir
它来制作相对于找到的文件目录的副本,例如
find Italy -name '*.front.*' -execdir cp -- {} 'fanart.jpg' \;
示例:给定
$ tree Italy/
Italy/
├── Florence
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
├── Naples
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
└── Rome
├── photo.back.001.jpg
├── photo.back.002.jpg
├── photo.back.003.jpg
├── photo.front.001.jpg
├── photo.front.002.jpg
└── photo.front.003.jpg
3 directories, 18 files
然后
$ find Italy -name '*.front.*' -execdir cp -v -- {} 'fanart.jpg' \;
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
(请注意,如果有多个文件与该*.front.*
模式匹配,则副本将被连续覆盖 - 如果这不是您想要的,请添加-n
或--no-clobber
),从而导致
$ tree Italy/
Italy/
├── Florence
│ ├── fanart.jpg
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
├── Naples
│ ├── fanart.jpg
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
└── Rome
├── fanart.jpg
├── photo.back.001.jpg
├── photo.back.002.jpg
├── photo.back.003.jpg
├── photo.front.001.jpg
├── photo.front.002.jpg
└── photo.front.003.jpg
如果您的系统版本find
不支持-execdir
替代方法,则可以删除完整路径名的文件名部分 - 例如使用表单的 POSIX 参数扩展"${var%/*}"
- 并在一个小的内联 shell 命令中将其替换为新名称sh -c
find Italy -name '*.front.*' -exec sh -c 'cp -v -- "$1" "${1%/*}/fanart.jpg"' sh {} \;
答案2
您有使用要求吗find
?对于类似的事情,我发现循环更合适:
$ cd /home/user/Pictures/Vacation/Italy
$ for directory in *; do \
cd "$directory" && \
for file in *front*; do \
cp --force "$file" fanart.jpg; \
done; \
cd /home/user/Pictures/Vacation/Italy; \
done
本质上,这只是遍历“Italy”的子目录,并且对于每个子目录,将名称中带有“Front”的文件复制到名为“fanart.jpg”的文件中(覆盖内容,因为目标文件名是不变的。)