按模式搜索,并在同一文件夹中复制但使用不同的名称

按模式搜索,并在同一文件夹中复制但使用不同的名称

这是文件夹结构:

/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”的文件中(覆盖内容,因为目标文件名是不变的。)

相关内容