Unix movendo / removendo arquivos de subdiretórios

1

se houver vários subdiretórios no diretório de trabalho atual, eu gostaria de mover somente tipos de arquivos específicos ou possivelmente todo o conteúdo desses diretórios para o diretório de trabalho. e depois; "rmdir *" esses diretórios vazios ou "rm -r" esses diretórios (se não estiverem vazios)

Isso não deve ser feito com o utilitário "find", em seguida, pipe | a saída para "mv". (move encontrar resultados para o diretório de trabalho)? Em caso afirmativo, quais são as opções de localização que preciso passar, por exemplo, ou Que tipo de comandos devem ser usados para arquivos rm ou mv nos subdiretórios e, talvez, remover os diretórios depois?

Este método é seguro para mover nomes de arquivos duplicados no mesmo diretório? ou os arquivos seriam sobrescritos, se houver muitos index.htmls por exemplo

Esta deve ser uma tarefa básica em tipos de arquivos especificados unix, mv ou rm de vários subdiretórios

    
por z4nb0t 11.05.2013 / 16:49

2 respostas

3

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 .

    
por 11.05.2013 / 17:03
0

Você pode fazer isso de uma só vez com um comando como: \

find . -name '*.goaway' -exec mv '{}' destination \;

mas uma maneira mais segura pode ser começar apenas vendo o que o comando find descobre para você, possivelmente canalizando-o para um arquivo que você pode usar para fazer as operações acutais.

E, sim, se você mover todos os seus index.html para o mesmo diretório, eles vão se desmembrar e você só terá o último movido para a esquerda depois.

    
por 11.05.2013 / 16:58