find dir1/ -name "file.name.[1-3]" -exec bash -c 'mv {} dir2/$(basename "{}").$(date +%Y%m%d%H%M%S)' \;
Eu tenho dois diretórios:
/routea/path/to/dir1
/routeb/path/to/dir2
em dir1
eu tenho alguns arquivos:
file.name
file.name.1
file.name.2
file.name.3
(pode haver mais de 4 arquivos).
Preciso mover os arquivos que terminam de 1 a 3 para dir2
Eu tentei (o que eu presumi ser o passo óbvio) de:
mv /routea/path/to/dir1/file.name.* /routeb/path/to/dir2/
Mas isso só me diz
mv: cannot stat '/routea/path/to/dir1/file.name.*': No such file or directory
Para complicar, idealmente, gostaria de adicionar um registro de data e hora ao final de cada arquivo conforme eu os movo, então acabo com algo como file.name.1.yyyymmddhhmmss
alguém pode me apontar na direção certa, por favor. Eu suponho que precisarei usar algum tipo de loop para fazer isso, mas não consigo ver como.
Você pode fazer isso por exemplo com o loop for como o abaixo:
for f in /routea/path/to/dir1/file.name.? ; do fn='echo $f | cut -d'/' -f6'; mv $f /routeb/path/to/dir2/$fn.'date +%Y%m%d%H%M' ; done
O comando cut deve ser personalizado com base em quantos subdiretórios você possui. Data é adicionada também. Testado com bash no RedHat.
Se você iniciar o comando no diretório /route/path/to/dir1/
, não será necessário o
fn='echo $f | cut -d'/' -f6';
parte.
com zsh
:
autoload zmv # best in ~/.zshrc
zmv "/routea/path/to/dir1/(file.name.<1-3>)" "/routeb/path/to/dir2/\.$(date +%Y%m%d%H%M%S)"