Remova 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:

Ao mover vários arquivos, o último argumento deve ser um diretório

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?

Casper
fonte

Respostas:

14

Use aspas:

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

Senão mvvê vários argumentos. Um nome de arquivo chamado file name with spacesseria de 4 argumentos para mv. Portanto, o erro: when moving multiple files, last argument must be a directory. Quando mvpossui mais de 2 argumentos, supõe-se que você queira 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 de maneira mais simples com bash:

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

Edit : Eu adicionei a --bandeira, graças ao comentário de @ pabouk . Agora, o arquivo que começa com o traço -também é processado corretamente.

caos
fonte
2
Isso pode não funcionar com nomes de arquivos iniciados por -. Em vez de echo "$file"usar printf '%s\n' "$file".
Pabouk
Eu esqueci mv. :) Você lidou com esse caso :) --- O que eu quis dizer foi problema consigo echomesmo. Por exemplo GNU echo (tanto autônomo eo bash built-in) não vai imprimir esses strings: -n, -ee -E. Mesmo de acordo com a definição POSIX, não é possível usar de echomaneira confiável, porque certas situações são indefinidas. Compatível com XSI echointerpretará seqüências de escape de barra invertida. --- printf '%s\n'não possui efeitos indesejados e dependentes da implementação.
Pabouk
3

Você pode usar o nome do usuário, que geralmente é distribuído junto com o Perl. (Por exemplo, no Debian, / usr / bin / prename é instalado pelo perlpacote.) Se não estiver empacotado pela sua distribuição (procure prenamee renamenos locais dos binários convencionais), ele estará disponível para download em vários locais, 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 a expressão regular.

Por exemplo, você pode fazer

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

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

um CVn
fonte