Script Bash para localizar e alterar recursivamente as extensões de arquivo

1

Eu quero montar um pequeno script que altere a extensão de todos os arquivos em um diretório que tenha uma certa extensão, como .png ou .gif .

Meu pensamento é que o script só aceita 2 argumentos na execução. Um é a extensão para mudar e o segundo é a extensão para a mudança.

Originalmente, eu estava pensando em usar o read para obter o diretório de destino, mas isso torna isso muito complicado, então estou apenas fazendo com que funcione no diretório atual. Estou usando o Debian 9, então o comando rename não está disponível.

Isso funciona com conteúdo fixo (txt para rdf):

$ find -depth -name "*.txt" -exec sh -c 'mv "$1" "${1%.txt}.rdf"' _ {} \;

no entanto, não consigo descobrir como alterar as extensões para o conteúdo das variáveis que herdam os argumentos transmitidos. estes serão $ 1 $ 2 por padrão, mas quando eu alterá-lo como abaixo, ele não funciona.

$ find -depth -name "*.$1" -exec sh -c 'mv "$1" "${1%.$1}.$2"' _ {} \;

Este exemplo apenas acrescenta um. ao final de todos os arquivos correspondentes. O que estou perdendo aqui?

    
por DanMan3395 06.07.2018 / 22:19

1 resposta

2
#!/bin/sh

find . -depth -name "*.$1" -exec sh -c '
    from=$1
    to=$2
    shift 2
    for pathname do
        mv "$pathname" "${pathname%.$from}.$to"
    done' sh "$1" "$2" {} +

Isso permite que o script interno tome os sufixos de nome de arquivo como parâmetros, bem como uma lista de nomes de caminho a serem alterados. No script interno, você extrai os dois sufixos e os desloca para fora da lista de argumentos, em seguida executa um loop sobre os nomes de marcas fornecidos ao script em find .

Menos eficiente (uma invocação de sh -c por nome de caminho em vez de percorrer um lote deles):

#!/bin/sh

find . -depth -name "*.$1" -exec sh -c 'mv "$3" "${3%.$1}.$2"' sh "$1" "$2" {} ';'

Como observação: crie o hábito de usar sh ou find-sh ou algum outro nome relevante para o argumento zeroth no script interno. Esse argumento é usado em mensagens de erro do script e a mensagem de erro proveniente de _ pode ser confusa em algumas circunstâncias.

    
por 06.07.2018 / 22:49