Atravessar, copiar e transformar nomes de arquivos

4

Meu problema: preciso copiar os arquivos de log, todos com nomes idênticos, mas armazenados em subdiretórios de até uma profundidade e alterar seus nomes.

Estou copiando da pasta chamada Logfiles, que contém várias pastas:

W3SVC114 , W3SVC1507562355 , W3SVC350179472 , etc.

Cada uma dessas pastas conterá um arquivo chamado: u_ex[YYMMDD].log , onde [YYMMDD] é um registro de data.

Eu preciso de todos esses arquivos de log em uma pasta. Como todos os nomes são idênticos, gostaria de adicionar o nome do diretório ao nome do arquivo resultante, por exemplo:

W3SVC1507562355/u_ex150407.log torna-se W3SVC1507562355_u_ex150407.log

Como faço tudo isso acontecer? Estou um pouco fora da minha profundidade aqui ...: - /

    
por Evert Meulie 07.04.2015 / 10:43

4 respostas

1

Você pode usar o seguinte script para copiar arquivos de um local para outro com nome modificado.

Observação: no script a seguir, temos dois valores codificados.

  1. / Logfiles / : - altera o nome do arquivo de registro para o nome válido da pasta a partir do qual você deve copiar os arquivos.

  2. / tmp / : - É um diretório sob o qual você deseja copiar arquivos. Altere este nome de diretório de acordo com seus requisitos.

    #!/bin/bash
    
    find /Logfiles/ -maxdepth 1  -type f |  #find all files located under folder Logfiles with maxdepth one.
    
    while read FILEDIR                          #Read all files line by line.
    
    do
    
       DIR="${FILEDIR%/*}"                   # Get the folder name its inside
    #       echo $DIR
    
       FILE="${FILEDIR/*\/}"                 # Get the plain file name.
    #    echo $FILE
    
       NEWFILE="${DIR}"_"${FILE}"           # set new filename.
    #       echo $NEWFILE
    
       echo -e "coping $FILE from $DIR in /tmp with name $NEWFILE \n"
    
    
      cp $DIR/$FILE /tmp/$NEWFILE     #copy file from old location to new location with modified name.           
    
    
    done
    
por 07.04.2015 / 11:21
1

Zsh vem com uma função chamada zmv que facilita mover ou copiar arquivos e aplicar transformações baseadas em padrão no nome. Coloque isso no seu .zshrc (ou execute-o na linha de comando):

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

Em seguida, sua cópia com renomeação pode ser feita com qualquer um dos seguintes comandos equivalentes:

zcp 'Logfiles/(*)/(*.log)' 'destination_directory/${1}_$2'
zcp -w 'Logfiles/*/*.log' 'destination_directory/${1}_${2}.log'
zcp -W 'Logfiles/*/*.log' 'destination_directory/*_*.log'

Se você não quiser instalar o zsh, você pode fazer a mesma coisa com um loop em qualquer shell:

cd Logfiles
for x in */*.log; do
  cp -- "$x" "destination_directory/${x%/*}_${x##*/}"
done
    
por 08.04.2015 / 01:42
1

Com pax :

pax -'rws|/|_|' -- */u_ex150407.log target/dir

pax é o arquivador de arquivos padrão especificado pelo POSIX. Infelizmente, embora seja necessário na Base do Linux Standard e tem sido para alguns incrementos de versão do mesmo - por qualquer motivo, muitas distribuições não empacotam com a instalação padrão como ambos os padrões requerem. Eu considero isso uma vergonha, porque é uma ferramenta muito versátil.

Acima, eu digo a pax para entrar em -r ead e -w rite mode (que se traduz em uma cópia) e - ao nomear seus arquivos de saída - para -s ubstitute the primeiro / em qualquer um dos seus parâmetros de arquivo de cópia nomeados com _ . Você pode basicamente fazer a sintaxe padrão do BRE sed (exceto que as novas linhas literais no lado esquerdo são permitidas aqui) , mas não há necessidade de nada elaborado neste caso.

De qualquer forma, é tudo que você precisa. Se você não tiver instalado por algum motivo, recomendo que você o obtenha e dê uma chance ao pax .

    
por 08.04.2015 / 05:26
1

Resposta da shell POSIX simples:

#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done

move cada arquivo correspondente a */*.log para o mesmo nome com / substituído por _ .

    
por 05.05.2015 / 18:48