Como posso mover pastas que contêm um arquivo com uma extensão específica para uma pasta de destino?

3

Há muitos anos, converti uma parte dos meus arquivos para um formato arbitrário com uma extensão específica. Eu não desejo mais tê-los neste formato e gostaria de começar o processo de substituí-los porque a conversão não é uma solução apropriada. infelizmente, eles são misturados em pastas separadas da mesma pasta raiz com arquivos no meu formato atual de uma extensão diferente. Eu sinto que isso facilitaria esse processo se eu movesse todas as pastas que continham um arquivo com o formato indesejado para uma pasta raiz separada. Os arquivos são armazenados em um servidor Linux e compartilhados via samba. Como posso fazer isso com alguns comandos ou um script? Estou aberto a outras sugestões também. Eu quero evitar o tempo gasto na edição de arquivos de texto. Por fim, gostaria que um comando que produzisse uma lista de caminhos completos para pastas, classificadas pelo número de níveis, seria um toque agradável. Uma lista de todos os arquivos claramente não é o que estou procurando.

    
por Joshua K 03.10.2010 / 05:43

2 respostas

2

encontre. tipo f | sed "s # ^. # $ (pwd) #"

retorna caminhos completos para todos os arquivos + um líder / quando executado na raiz você pode canalizar isso para grep e combinar a extensão seguido por e endline

soltar isso em um arquivo de texto para manipulações

agora você pode contar os / s em uma linha e dividir o nome do arquivo no final e mv $ line em / adir / filename

tudo isso pode estar em um único script bash ... eu não sou suficientemente bom no script do bash para torná-lo um oneliner, mas isso faz com que você chegue a maior parte do caminho. você pode querer ficar atento à sobregravação de arquivos se fizer isso.

apenas como eu lidaria com isso

de AQUI PARA BAIXO É NOVO

desde que, evidentemente, é meu trabalho escrever um roteiro totalmente funcional, já que você não pode ler faqs on-line ou responder quando for perguntado de que modo ele falha:

find . -type f | sed "s#^.#$(pwd)#" | grep '.xml'> test.txt  
./atest.sh > test2.txt  

----atest.sh begin----  
#!/bin/bash  
while read line  
do  
dirname $line  
done 

O que mais você precisa de scripts para? porque eu realmente não tenho nada melhor para fazer

a saída desse script é apenas os nomes de diretório que continham arquivos terminados em .xml ou diretórios terminados em .xml

    
por 03.10.2010 / 06:07
2

A SOURCE deve ser o diretório mais superior que você está pesquisando. Se os arquivos estiverem armazenados em todo o sistema de arquivos, SOURCE deverá ser o próprio sistema de arquivos.

find ~/SOURCE -name '*.YOUR_EXTENSION' -exec mv {} ~/DESTINATION \;

Renomeie-os assim:

$ rename -v 's/\.YOUR_EXTENSION$/\.NEW_EXTENSION/' *.YOUR_EXTENSION

Seria uma boa ideia executar isso com a opção -n em vez da opção -v ANTES de você realmente querer fazer a renomeação, porque a opção -n executará uma simulação e fornecerá os resultados dessa simulação.

    
por 03.10.2010 / 08:23