Usando prename
(com alias para rename
em muitos sistemas), é possível fazer isso sem várias execuções de mv
ou cp
:
cd /home/user
find . -type f -name 'Loads.bdf' -exec \
prename -n 's:^./::; s:/:_:g; s:^:destination/:' {} +
Remova o -n
quando tiver certeza de que isso está movendo os arquivos desejados.
Atualizar
Para copiar os arquivos em vez de movê-los, o modo mais rápido é copiar primeiro com cpio
ou pax
e renomear como antes. Por exemplo (com GNU cpio
):
cd /home/user
find . -type f -name 'Loads.bdf | cpio -p --make-directories destination
cd destination
find . -type f -name 'Loads.bdf' -exec prename -n 's:^./::; s:/:_:g' {} +
Observe que, embora pax
seja POSIX e LSB e cpio
não seja mais POSIX, cpio
ainda é o programa que geralmente é encontrado em muitos sistemas.
Para lidar com nomes de arquivos com novas linhas com o GNU find
/ cpio
, é possível adicionar -print0
a find
e -0
a cpio
.
Atualização 2
A solução pax
é uma linha única (sem incluir o cd
):
cd /home/user
find . -name 'Loads.bdf' | cut -d/ -f 2- | pax -rws ':/:_:g' destination
Ou para qualquer nome de arquivo (e GNU find
):
find /home/user -name 'Loads.bdf' -printf '%Pcd /home/user
find . -type f -name 'Loads.bdf' -exec \
prename -n 's:^./::; s:/:_:g; s:^:destination/:' {} +
' | pax -0rws ':/:_:g' destination