como renomear arquivos durante a cópia?

11

Como eu copiaria (estilo de arquivamento onde a data não é alterada) todos os arquivos em um diretório de backup para o diretório do usuário enquanto renomeava cada arquivo para remover a parte de string aleatória 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 cadeia de data e hora seguida pela cadeia aleatória e depois pela extensão ".etf". Eu quero manter todos os elementos de nome, incluindo o carimbo de data e hora. Eu só quero remover a string aleatória.

A string aleatória permite vários backups do mesmo arquivo. No entanto, neste caso, eu apenas corri fdupes e não há duplicatas. Então eu posso simplesmente restaurar todos os arquivos, removendo a string aleatória.

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

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

    
por MountainX 19.02.2014 / 01:14

4 respostas

6

pax pode fazer isso tudo de uma vez. Você poderia fazer:

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

pax preserva os tempos por padrão, mas pode adicionar -pe para preservar tudo (melhor feito como root) ou -pp para preservar as permissões, por exemplo:

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

Caso contrário ( pax geralmente não está disponível por padrão), certamente é melhor fazer uma cópia e depois 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.

    
por 19.02.2014 / 12:15
15

Você pode usar o comando cp com a opção -a

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

E, em seguida, use um loop for para renomear todos os arquivos ao copiá-los:

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

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

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

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

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done
    
por 19.02.2014 / 01:37
3

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

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

Em seguida, use

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

No bash:

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

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

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

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done
    
por 20.02.2014 / 00:26
1

cp não tem esse recurso. Lembro-me de cpio ser capaz de fazer isso, mas a página atual diz o contrário. No entanto, (gnu) tar tem uma opção --transform :

 --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)
    
por 19.02.2014 / 01:38