Procura por padrão e copia dentro da mesma pasta mas com um nome diferente

0

Esta é a estrutura de pastas:

/ home / user / Pictures / Férias / Itália / Roma / foto. frente .001.jpg

Dentro da pasta Rome eu tenho muitas outras fotos, mas estou interessado somente naquelas que têm " front " no nome do arquivo. Destes eu devo fazer uma cópia e chamá-lo de " fanart.jpg " (ainda na pasta Rome).

Eu gostaria de fazer isso para todas as pastas armazenadas na pasta pai da Itália.

Estou tentando usar find para procurar por essas imagens, mas não consigo fazer uma cópia com um nome diferente.

Você tem uma ideia de como resolver isso?

    
por Issam2204 19.06.2016 / 13:48

2 respostas

2

Você deve poder usar -execdir para fazer uma cópia relativa ao diretório do (s) arquivo (s) encontrado (s), por exemplo.

find Italy -name '*.front.*' -execdir cp -- {} 'fanart.jpg' \;

Exemplo: dado

$ 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

Então

$ 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’

(observe que, se houver vários arquivos correspondentes ao padrão *.front.* , a cópia será substituída sucessivamente - se não for o que você deseja, adicione -n ou --no-clobber ), resultando em

$ 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

Se a versão de find do seu sistema não suportar -execdir , um modo alternativo seria remover a parte do nome do nome completo do nome do arquivo - por exemplo, usando a expansão do parâmetro POSIX do formulário "${var%/*}" - e substituí-lo por o novo nome em um pequeno comando shell inline sh -c

find Italy -name '*.front.*' -exec sh -c 'cp -v -- "$1" "${1%/*}/fanart.jpg"' sh {} \;
    
por 19.06.2016 / 15:15
0

Você tem um requisito para usar find ? Para coisas assim, acho que os loops são mais apropriados:

$ 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

Essencialmente, isso apenas passa por subdiretórios da "Itália" e para cada um deles copia arquivos com "Front" em seu nome para um arquivo chamado "fanart.jpg" (sobrescrevendo as coisas, porque o nome do arquivo de destino é constante).

    
por 19.06.2016 / 14:58

Tags