Você não pode realmente influenciar o ambiente "horizontalmente" no pipe - os processos em um ... p_n | p_n+1 | p_n+2 ...
pipe são gerados pelo mesmo interpretador de shell, portanto não há como alterar a variável de ambiente de p_n
de p_m
, echii está no mesmo pipeline.
Se você só precisa fazer uma transformação simples dos nomes de arquivos, o que pode ser conseguido com expressões regulares, então o Perl exemplo rename
deve fazer. Você pode querer / precisar usar xargs
para evitar problemas com escape
find ... -print0 | xargs -0 rename "regexps"
que delimita os nomes dos arquivos com bytes NUL (NUL e contrabarra são os únicos caracteres que geralmente são proibidos de aparecer em um nome de arquivo).
Se os nomes dos seus arquivos forem bem comportados (e, portanto, você pode supor que você não precisa de nenhum escape especial de caracteres "estranhos" como aspas, espaços e separadores usados nos regexps), você também pode fazer algo rápido e sujo como:
find ... | sed -r "regexps" | sh -
Nesse caso, o regexps precisa criar um comando válido chamando mv
(ou qualquer outra coisa que execute a ação desejada) - pode parecer:
"s|^.*$|mv -vi & &.old|"
que produz algo como
...
mv -vi /etc/a2ps.cfg /etc/a2ps.cfg.old
mv -vi /etc/aclocal_dirlist /etc/aclocal_dirlist.old
...
Se a expressão regular simples não for poderosa ou for muito pesada , apenas escreva um script simples que processe nomes de arquivos e renomeie / mova-se e chame-o diretamente de find ( -exec
ou -exec +
) ou através de xargs
.
Por fim, se você quiser apenas mover o grupo de arquivos para outro diretório, use a opção -t
de cp
e mv
. cp
no GNU coreutils também tem a opção --parents
, que copia a fonte com seu caminho completo.