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?
-
. Em vez deecho "$file"
usarprintf '%s\n' "$file"
.mv
. :) Você lidou com esse caso :) --- O que eu quis dizer foi problema consigoecho
mesmo. Por exemplo GNU echo (tanto autônomo eo bash built-in) não vai imprimir esses strings:-n
,-e
e-E
. Mesmo de acordo com a definição POSIX, não é possível usar deecho
maneira confiável, porque certas situações são indefinidas. Compatível com XSIecho
interpretará seqüências de escape de barra invertida. ---printf '%s\n'
não possui efeitos indesejados e dependentes da implementação.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
perl
pacote.) Se não estiver empacotado pela sua distribuição (procureprename
erename
nos 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
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
.fonte