shell script: iterando através de diretórios e movendo / renomeando arquivos

2

(FYI, eu tenho muito pouco conhecimento de script de shell)

Eu tenho uma tonelada de arquivos e diretórios parecidos com

-root
 -dir1/a.txt
 -dir2/a.txt
 -dir3/b.txt
 -dir4/b.txt
 -dir5/c.txt

Eu gostaria de poder combinar / concatenar todos os arquivos com os mesmos nomes de arquivos, e depois colocar tudo na raiz. Então, o resultado final seria parecido com

-root/a.txt (combined from dir1 and dir2)
-root/b.txt (combined from dir3 and dir4)
-root/c.txt

Se isso não for possível, eu até me contentaria em mover todos os arquivos para a raiz e fazer uma renomeação em lote. Então, algo parecido com

-root/a.txt.1
-root/a.txt.2
-root/b.txt.1
-root/b.txt.2
-root/c.txt.1

Espero que faça sentido, e obrigado antecipadamente:)

    
por Kar 19.01.2012 / 11:01

1 resposta

0

Se quiser combiná-los e os nomes dos arquivos forem conhecidos de antemão, você poderá tentar algo como:

for i in a b c d
do
find <root direcoty> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

Para cada um, b, c, ed procuramos os arquivos que têm o nome a.txt (b.txt ... d.txt) em todos os diretórios e invocamos cat nos nomes dos arquivos e canalizamos Saída para um arquivo com o mesmo nome sob o diretório raiz.

Se eles não são conhecidos de antemão, fica um pouco complicado, mas aqui:

for i in 'find <root directory> -type f | sed -E 's!\./.*/([a-zA-Z0-9]+)\.txt!!g''
do
find <root directory> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

É o mesmo que o comando anterior, exceto de onde obtemos nossa lista. Primeiramente, obtemos uma lista de todos os arquivos no diretório raiz e, em seguida, removemos todas as partes dos nomes dos arquivos para incluir apenas o nome do arquivo, eh, (sem direcotry e sem extensão). Você deve observar que isso funcionará apenas para arquivos que possuem letras maiúsculas e minúsculas misturadas com números como seus nomes, sem traços ou sob pergaminhos. Se você quiser, altere [a-zA-Z0-9] para [a-zA-Z0-9-_] .

Altere qualquer instância de <root directory> para o caminho desejado.

    
por 19.01.2012 / 13:57

Tags