Como remover prefixos e sufixos de nomes de arquivos em um determinado diretório?

2

Eu tenho muitos arquivos com o mesmo prefixo e o mesmo sufixo. Eu quero remover os dois nomes de arquivos. Ambos contêm espaços.

Portanto, foo bar XXX doo par.jpg , foo bar YY YY doo par.jpg se tornaria XXX.jpg e YY YY.jpg

    
por John Taylor 08.02.2016 / 03:57

2 respostas

3

com nome de usuário:

Configuração:

$ mkdir test && cd test
$ > "foo bar XXX doo par.jpg"; > "foo bar YY YY doo par.jpg"

Ação:

$ rename -n 's/^foo bar //; s/ doo par(\.[^.]*)$/$1/'  *
  foo bar XXX doo par.jpg renamed as XXX.jpg
  foo bar YY YY doo par.jpg renamed as YY YY.jpg

(Remova o -n para realizar esses movimentos)

    
por 09.02.2016 / 00:28
3

Se o nome do arquivo estiver em uma variável, a maneira canônica de remover um prefixo é:

removepre="foo bar "
filename="foo bar XXX doo par.jpg"
filename="${filename#"$removepre"}"
echo "$filename"

O problema com o sufixo que você apresenta é que existe uma extensão que você deseja preservar, então ele se torna um pouco mais longo:

removesuf=" doo par"
filename="foo bar XXX doo par.jpg"
extension="${filename##*.}"            ### store extension in a variable.
filename="${filename%.*}"              ### remove extension.
filename="${filename%"$removesuf"}"    ### remove suffix.
filename="$filename.$extension"        ### re-place the extension
echo "$filename"

Todos participaram de um script:

#!/bin/bash
filename="$1"

removepre="foo bar "
filename="${filename#"$removepre"}"

removesuf=" doo par"
extension="${filename##*.}"            ### store extension in a variable.
filename="${filename%.*}"              ### remove extension.
filename="${filename%"$removesuf"}"    ### remove suffix.
filename="$filename.$extension"        ### re-place the extension
echo "$filename"

Chame o script assim:

$ ./script "foo bar XXX doo par.jpg"
XXX.jpg"

Entenda que as cotações são obrigatórias para processar nomes de arquivos com espaços.

    
por 08.02.2016 / 04:29