Поиск по шаблону и копирование в той же папке, но с другим именем

Это структура папок:

/ home / user / Pictures / Vacation / Italy / Rome / Фото. front .001.jpg

В папке Rome у меня есть много других фотографий, но меня интересуют только те, у которых есть « front » в имени файла. Из них я должен сделать копию и назвать ее " fanart.jpg " (все еще находится в папке Рима).

Я хочу сделать это для всех папок, хранящихся в родительской папке Италия.

Я пытался использовать find для поиска этого изображения, но потом мне не удалось сделать копию с другим именем.

У вас есть идея, как решить эту проблему?

0
19.06.2016, 16:30
2 ответа

У вас должна быть возможность использовать -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 {} \;
2
28.01.2020, 02:35

Есть ли у вас требование использовать 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» "(перезапись, потому что имя файла назначения является постоянным.)

0
28.01.2020, 02:35

Теги

Похожие вопросы