Remover certos caracteres de vários arquivos com espaços em branco

8

Estou tentando renomear um monte de faixas de música em um diretório, mas recebi este erro:

When moving multiple files, last argument must be a directory

Este é o script:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Isso funciona para um arquivo sem espaço em branco, como eu modificaria esse script?

    
por Casper 23.10.2015 / 07:49

2 respostas

14

Use aspas:

mv -- "$file" "$(echo "$file" | sed ...)"

Else mv vê vários argumentos. Um nome de arquivo chamado file name with spaces seria 4 argumentos para mv . Portanto, o erro: when moving multiple files, last argument must be a directory . Quando mv tem mais de 2 argumentos, está assumindo que você deseja mover vários arquivos para um diretório (que seria o último argumento).

Mas, no entanto, parece que você deseja remover os 5 primeiros caracteres do nome do arquivo. Isso pode ser feito mais simples com bash :

mv -- "$file" "${file:5}"

Editar : adicionei o sinal -- , graças ao comentário de @ pabouk . Agora os arquivos que começam com traço - também são processados corretamente.

    
por 23.10.2015 / 07:57
3

Você pode usar o prename, que geralmente é distribuído junto com o Perl. (Por exemplo, no Debian, o / usr / bin / prename é instalado pelo pacote perl .) Se não for empacotado pela sua distribuição (procure por prename e rename nos locais dos binários convencionais), ele estará disponível para faça o download de vários lugares, como, por exemplo, aqui , aqui ou aqui .

Esse script usa uma expressão regular para aplicar a cada um dos nomes de arquivos e um conjunto de nomes de arquivos e modifica os nomes desses arquivos de acordo com essa expressão regular.

Por exemplo, você pode fazer

prename -v -n 's/^.{5}//' *

para mostrar o que aconteceria se você removesse os primeiros cinco caracteres nos nomes dos arquivos. Para realmente executar a renomeação, basta remover o -n .

    
por 23.10.2015 / 21:16