Localizar, duplicar, renomear e copiar para esta pasta

0

Cartaz da primeira vez, então vá com calma comigo haha.

Iniciante linux usuário, começando bash scripting e quer fazer um script para digitalizar minha pasta de programas de TV para fanart.jpg (cada show tem este arquivo) criar uma duplicata, renomeá-lo (como eu entendo unix systmes não auto renomear arquivos ou permitir arquivos com os mesmos nomes em um diretório) e copie para uma pasta de papel de parede.

Li muitos artigos e não consigo encontrar uma maneira relativamente simples de fazer isso.

Até agora, tudo o que tenho é:

cd /mnt/TV\ Shows/

find /mnt/TV\ Shows/ -name fanart.jpg

O que me dá uma lista de todos os meus arquivos fanart.jpg em suas respectivas pastas.

Eu tentei algumas coisas diferentes depois disso, como sed mv e cp , mas não consigo trabalhar.

A pasta de destino é /mnt/Wallpapers/Slideshow/

Qualquer ajuda seria muito apreciada.

Felicidades!

    
por Jiggles2018 30.03.2018 / 17:07

1 resposta

1

Aqui está um exemplo de script que os usuários find , cuja saída é canalizada para um while loop:

find "/mnt/TV Shows/" -type f -name "fanart.jpg" | while IFS= read -r item; do
    NAME="${item##*/}"
    echo cp "$item" "/mnt/Wallpapers/Slideshow/${NAME%.*}-$((i++)).${NAME##*.}"
done
  • Remova echo da ação.

  • O nome do arquivo de destino consistirá em:

    ${name of source file}-$((sequential number))-${extension of source file}
    
  • A numeração começará em 0 , porque a variável $i não foi pré-inicializada. Você pode colocar i=1; antes de find para começar a numeração de 1 .

Aqui está um script bash mais complicado que usa a opção globstart ** para fazer uma pesquisa recursiva de um arquivo dentro de uma pasta. Se houver uma coincidência, o arquivo será copiado para uma pasta de destino. Você pode escolher entre diferentes padrões do nome do arquivo de destino, alterando a parte interna (if-fi) do script.

#!/bin/bash

INPUT_PATH="/mnt/TV Shows"
INPUT_FILE_NAME="fanart.jpg"
OUTPUT_PATH="/mnt/Wallpapers/Slideshow"

shopt -s globstar

for item in "${INPUT_PATH}"/**; do
    # If the item is a file and its name is equal to the INPUT_FILE_NAME
    if [[ -f "$item" && "${item##*/}" == "$INPUT_FILE_NAME" ]]; then
        # Compose OUTPUT_FILE name based on the parent directory name
        INPUT_FILE_FULL_PATH="${item%/*}"
        INPUT_FILE_PARENT_DIR="${INPUT_FILE_FULL_PATH##*/}"
        OUTPUT_FILE_NAME="${INPUT_FILE_NAME%.*}-${INPUT_FILE_PARENT_DIR}.${INPUT_FILE_NAME##*.}"
        # Remove 'echo' to execute the command !!!
        echo cp "${item}" "${OUTPUT_PATH}/${OUTPUT_FILE_NAME}"
    fi
done

Referências:

por pa4080 30.03.2018 / 20:33