como renomear arquivos enquanto copia?

12

Como eu copiava (estilo de arquivo onde a data não é alterada) todos os arquivos em um diretório de backup para o diretório do usuário enquanto renomeia cada arquivo para remover a parte aleatória da cadeia de caracteres do nome (por exemplo, -2b0fd460_1426b77b1ee_-7b8e)?

cp de:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

para:

/home/user/data/Erp.2014.02.16_16.57.03.etf

Cada arquivo sempre começará com "Erp". seguido pela sequência de carimbo de data e hora, seguida pela sequência aleatória e depois pela extensão ".etf". Quero manter todos os elementos de nome, incluindo o carimbo de data e hora. Eu só quero remover a sequência aleatória.

A sequência aleatória permite vários backups do mesmo arquivo. No entanto, neste caso, eu apenas executei fdupes e não há duplicatas. Para que eu possa simplesmente restaurar todos os arquivos, removendo a sequência aleatória.

Estou procurando um comando bash de uma linha para fazer isso.

Se isso não funcionar, eu poderia fazê-lo em duas ou mais etapas. Eu normalmente uso o KRename, mas neste caso eu preciso fazê-lo no bash. (Estou trabalhando remotamente.)

MountainX
fonte

Respostas:

7

paxpode fazer isso de uma só vez. Você poderia fazer:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxpreserva os tempos por padrão, mas pode adicionar -pepara preservar tudo (melhor como root) ou -pppara preservar permissões, por exemplo:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

Caso contrário ( paxnormalmente não está disponível por padrão), certamente é melhor fazer uma cópia do que a rename:

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

Dessa forma, não há um processo diferente iniciado para cada arquivo.

Graeme
fonte
1
Percebo que preciso me familiarizar pax. Parece uma ferramenta muito útil. Faz-me pergunto porque não é padrão em mais distros ...
MountainX
@MountainX, boa pergunta, de acordo com a Wikipedia, paxestá na Base Padrão do Linux desde 2005. Além disso, a alternativa seria GNU cpio, possivelmente a ferramenta GNU menos característica da atualidade.
Graeme
1
+1 para sua última solução e Dessa forma, não há um processo diferente iniciado para cada arquivo. Mas rename é diferente no Fedora / Red Hat: não sei como usá-lo neste caso.
Erik
15

Você pode usar o cpcomando com a -aopção

-a, --archive
       same as -dR --preserve=all

E, em seguida, use um loop for para renomear todos os arquivos enquanto os copia:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

Pronto. Inicie este comando no diretório de origem.

Explicação: Ele %%-*cortará todos os caracteres após a primeira ocorrência de um hífen / menos -e .etfno final adicionará novamente a extensão do arquivo.

Bem, e como um forro, coloque tudo em uma linha. :-) Como isso

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done
erik
fonte
1
Obrigado, você poderia citar a documentação da %%-*dica? Estou curioso.
soyuka 8/04/2015
3

No zsh, use zmv. Coloque isso no seu .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

Então use

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Na festança:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Se você não possui o zsh, uma maneira POSIX usa pax (isso copia os diretórios recursivamente).

Se você estiver em um sistema restrito sem zsh e sem pax, poderá usar um loop:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done
Gilles 'SO- parar de ser mau'
fonte
1

cpnão tem essa capacidade. Lembro-me de cpiopoder fazer isso, mas a página atual diz o contrário. No entanto, (gnu) tartem uma --transformopção:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

Então você teria um cmdline como:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
Ricky Beam
fonte