Это структура папок:
/ home / user / Pictures / Vacation / Italy / Rome / Фото. front .001.jpg
В папке Rome у меня есть много других фотографий, но меня интересуют только те, у которых есть « front » в имени файла. Из них я должен сделать копию и назвать ее " fanart.jpg " (все еще находится в папке Рима).
Я хочу сделать это для всех папок, хранящихся в родительской папке Италия.
Я пытался использовать find
для поиска этого изображения, но потом мне не удалось сделать копию с другим именем.
У вас есть идея, как решить эту проблему?
У вас должна быть возможность использовать -execdir
для создания копии относительно каталога найденного файла (ов), например.
find Italy -name '*.front.*' -execdir cp -- {} 'fanart.jpg' \;
Пример: given
$ 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% / *}»
- и немного заменить его новым именем встроенная команда оболочки sh -c
find Italy -name '*.front.*' -exec sh -c 'cp -v -- "$1" "${1%/*}/fanart.jpg"' sh {} \;
Есть ли у вас требование использовать 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
По сути, это просто проходит через подкаталоги «Италия» и для каждого из них копирует файлы с «Front» в их имени в файл с именем «fanart.jpg» "(перезапись, потому что имя файла назначения является постоянным.)