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.