A seguir, todos os arquivos HTML são removidos de foo
e os diretórios vazios são removidos:
$ find foo -name '*.html' -type f -exec mv -nv "{}" '.' \;
foo/bar/1.html -> ./1.html
./1.html not overwritten
foo/baz/qux/3.html -> ./3.html
foo/baz/qux/5.html -> ./5.html
$ find foo -depth -type d -delete
O que resta são arquivos HTML com nomes de arquivos conflitantes, arquivos que não são arquivos HTML e pastas não vazias.
Para renomear arquivos automaticamente para evitar nomes de arquivos duplicados, você pode usar mktemp
. A sintaxe é diferente entre os sistemas operacionais, e o abaixo funciona no OS X e presumivelmente nos BSDs:
find foo -name '*.html' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
foo/bar/1.html -> ./1.html.yNr
foo/baz/1.html -> ./1.html.RUu
foo/baz/qux/3.html -> ./3.html.rzu
foo/baz/qux/5.html -> ./5.html.JyW
Para cada arquivo HTML encontrado, ele inicia o bash e executa o comando após -c
, que é realmente apenas um mv
com um nome de arquivo de destino criado dinamicamente (usando mktemp
) no diretório atual.
Para garantir que funcionará como pretendido, você pode usar echo
o comando mv
como pré-visualização:
find foo -name '*.html' -type f -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
mv -v foo/bar/1.html ./1.html.VNf
mv -v foo/baz/1.html ./1.html.pCW
mv -v foo/baz/qux/3.html ./3.html.ADN
mv -v foo/baz/qux/5.html ./5.html.K3w
Como você pode ver, todas as invocações resultam em um sufixo diferente, graças a mktemp
no script bash
(você não pode incluir essa parte em um -exec mv
regular, pois ela seria avaliada uma vez para o find
de chamada e, em seguida, use o mesmo sufixo para todos movidos).
Dependendo do número de arquivos envolvidos, você pode precisar de um sufixo aleatório maior do que apenas .XXX
.