Renomeando arquivos para o prefixo e a parte do meio do nome do arquivo

1

Eu tenho um script que em um momento faz o seguinte:

for src in $(find -H "$ROOT_DIR" -maxdepth 5 -name '*.test' -not -path '*.git*')
  do
    fixed_filename=$(echo "$(basename "${src%.*}")" | sed 's/-test//')

Basicamente, tenho arquivos chamados thing-test.js.test

Ao fazer o loop, eu gostaria de terminar com o nome do arquivo sendo thing.js

Eventualmente, vou criar o caminho completo para o arquivo usando path="$ROOT_DIR"/"$fixed_filename"

O parece funcionar, mas definitivamente não está correto - eu sou um ávido usuário de shellcheck e ele me diz que há um eco inútil (eu concordo) e tentar ${variable//search/replace} se possível .

Gostaria de receber ajuda sobre como limpar o texto acima.

Editar:

A essência básica do que estou tentando fazer é:

Estou tentando pesquisar recursivamente todos os arquivos em um diretório seguindo um padrão específico de nome de arquivo, por exemplo. file-test.js.test e dentro desses arquivos são variáveis de espaço reservado, por exemplo REPLACEME Eu quero encontrar todos esses arquivos, e um por um substitua REPLACEME com uma string fornecida pelo usuário de uma chamada de leitura dentro do script bash, e enquanto eu estiver lá eu gostaria de mudar o nome do arquivo para file.js eg remova -test e .test

    
por Sudoscience 10.05.2017 / 20:47

2 respostas

1

Para renomear stuff-X.js.test to stuff.js (sem saber a extensão antes de .test ) você teria que usar várias expressões para extrair as partes necessárias, por ex. divida o caminho na cabeça h=${path%/*} e tail t=${path##*/} , depois, pegue a string antes do traço com ${t%%-*} e, para a string no meio, obtenha o nome sem extensão, p. noext=${t%.*} a partir desse extrato, o que agora é a nova extensão com ext=${noext##*.} , algo como:

find . -name '*-*.test' -exec sh -c 'h=${1%/*}; t=${1##*/}; noext=${t%.*};\
ext=${noext##*.}; fixed=${h}/${t%%-*}.${ext}; echo mv "$1" "$fixed"' sh {} \;
    
por 10.05.2017 / 22:39
0

Use o comando find acoplado ao shell usando -exec flag:

$ find -name "*.test" -exec sh -c 'echo "$(basename -s ".test" "$1")".js'  sh {} \;  
one.js
three.js
two.js

Observe que basename -s ".test" "$1" remove o sufixo, portanto, você não precisa chamar sed em primeiro lugar.

Se, eventualmente, você precisar fazer outra coisa com esse "nome de arquivo fixo", substitua esse eco pela atribuição de variável e continue trabalhando no mesmo comando sh . Algo parecido com isto:

$ find -name "*.test" -exec sh -c 'fixed_name=$(basename -s ".test" "$1").js; my_other_command "$fixed_name"'  sh {} \;  
    
por 10.05.2017 / 21:01