cd Music/.. &&
mkdir Music2 &&
pax -'rwls|\([^/]\)_000$||p' Music Music2
Se executado a partir do diretório pai de Music , os comandos acima criarão um diretório chamado Music2 , em seguida, espelhará a estrutura de caminho Music em Music2 w / hardlinks, removendo qualquer ocorrência de _000 encontrado na cauda de qualquer nome de arquivo nele.
Em seguida, você terá basicamente duas rotas para o conteúdo de Music em Music/.. - uma em que alguns arquivos são nomeados com sequências _000 finais e um no qual há um menos _000 no cauda de cada nome de arquivo do que existe no outro (exceto para arquivos nomeados apenas _000 que não são alterados) - mas os arquivos reais são intocados. Se você achar que Music2/Music combina com você melhor - rm -rf Music e mv Music2/Music Music depois.
A suposição é que todo o conteúdo de Music está localizado no mesmo sistema de arquivos montado e que suporta hardlinks.
O perl-rename usado abaixo é o que pode ser encontrado em cpan.org em ~pederst/rename . Eu o instalei em um sistema Arch Linux com pacman . Agora, me disseram que há outro script mais seguro perl com o mesmo nome, que também pode ser encontrado em cpan.org/~rmbarker/File-Rename-0.20 . mas eu não tive sucesso em fazer isso funcionar. Esta falha é mais provável de fazer com o meu ser perl-inepto do que qualquer outra coisa embora.
De qualquer forma, aqui está um pequeno estudo de caso sobre os perigos de soluções de renomeação com script versus hardlinking com base em um padrão.
mkdir Music Music2
echo file1 >Music/file
echo file2 >Music/file_000
pax -'rwls|_000$||p' Music Music2
Eu uso o sinalizador p rint para a opção -s ubstitute para pax acima, então pax imprime somente os nomes dos arquivos que ele altera, embora vincule todos eles . Imprime:
Music/file_000 >> Music/file
Agora vamos ver como fizemos:
grep . /dev/null Music/* Music2/Music/*
OUTPUT
Music/file:file1
Music/file_000:file2
Music2/Music/file:file2
Uhoh. O resultado da vinculação de file de file_000 sobrescreveu a dentry para uma file anteriormente existente ao executar a operação de espelhamento. Mas neste caso, o link original ainda existe - e assim o arquivo também funciona. Além de manter uma cópia dentária de cópia no diretório existente do arquivo, pax (por padrão) -p reserva todos os atributos de arquivo que puder, independentemente dos arquivos que deve criar ou copiar, como deve crie diretórios (que não podem ser hardlinked) e se a fonte estiver em um sistema de arquivos diferente (que pode ser totalmente evitado com -X ) ele deve copiar.
E assim os dois diretórios diferentes podem ser comparados após o fato para diferenças antes de quaisquer alterações inalteráveis. E com o sinalizador p rint, você pode pegar os resultados que lhe entregam e fazer referência cruzada a todos os originais existentes. Se eles existirem, você terá pelo menos um arquivo tímido no novo destino.
Por outro lado, embora:
find Music -name \*_000 -exec perl-rename 's/_000$//' {} +
grep . /dev/null Music/*
OUTPUT
Music/file:file2
O mesmo não é verdadeiro quando o link do sistema de arquivos last para um arquivo é sobrescrito - esse arquivo é histórico.