Como remover '_' de todos os nomes de arquivos em um diretório

0

No bash, eu tenho um diretório descompactado onde eu tenho muitos nomes de arquivos que começam com _ .

Tenho certeza de que posso usar rename ou mv para simplesmente remover o prefixo _ de cada arquivo que o contém.

Eu tento:

for file; do
    mv "$file" "${file//_/}"
done

Mas isso não tem o efeito que eu gostaria. Qual comando posso usar para remover o prefixo _ de todos os arquivos?

    
por obidyne 20.02.2018 / 22:56

4 respostas

2

1) for file; do faz um loop sobre os parâmetros posicionais, ou seja, argumentos de linha de comando para o script. Use for file in *; do para percorrer os arquivos no diretório (ou _* para obter apenas aqueles com um prefixo de sublinhado).

2) Você pode usar ${file#_} em vez de ${file//_/} para remover o sublinhado do início do nome do arquivo. ${par#word} remove especificamente uma parte do começo, e é um recurso padrão, ao contrário de ${par/pat/repl} . E é claro que ${file//_} removeria as barras all (desde que você usou uma barra dupla), não apenas a primeira.

3) pelo menos no Linux (GNU userland) e no FreeBSD, você pode usar mv -n para solicitar que ele não sobrescreva nenhum arquivo. Apenas no caso.

Então,

for file in _*; do
    mv -n -- "$file" "${file#_}"
done
    
por 20.02.2018 / 23:06
2

Simplesmente com o comando prename (renomear Perl):

prename -n 's/^_//' _*
    
por 20.02.2018 / 23:02
0

Você está muito perto:

for file in _*; do
    if ! [[ -f "${file/_/}" ]]; then
        mv "$file" "${file/_/}"
    else
        echo "Replacement for '$file' already exists; skipping.." 1>&2
    fi
done

Por que ${file/_/} ? Porque você especificou um prefixo de sublinhado. Então, _file_name.ext se tornará file_name.ext . Com ${file//_/} , _file_name.ext se tornaria filename.ext .

    
por 20.02.2018 / 22:59
0

Você pode usar sed

for file in /some/path/*; do
    if [ -f "$file" ]; then
        mv "$file" 'echo "$file" | sed 's*_**g''
    fi
done
    
por 20.02.2018 / 23:06

Tags