Mesclando pastas com um script

0

Eu tenho uma lista de 417 caminhos de pasta que preciso mesclar em uma ordem específica para que os arquivos neles se sobreponham. Provavelmente precisarei fazer isso novamente no futuro quando fizer alterações na pasta, então, definitivamente, não estou fazendo isso manualmente, gostaria de aprender a escrever um script que faça isso.

Além disso, se o script puder converter tudo em minúsculas, isso seria ótimo também, o que fiz para isso foi que eu fiz um zip sem compactação, e então o descompactei com -LL, mas seria bom se eu não precisasse fazer isso novamente desde que demorou um pouco (17gb).

A lista é assim

"/ path /"

"/ path /"

"/ path /"

(se alguém estiver curioso, isso é para mesclar um monte de mods para morrowind / openmw)

    
por halbe 03.06.2017 / 06:52

2 respostas

0

Algo como isso deve funcionar:

while IFS= read -r dir
do
    cp -f "$dir"/* target
done < list

em que list é a lista de diretórios e target é o diretório para o qual você deseja copiar os arquivos. Os arquivos nos diretórios que aparecem mais tarde na lista irá sobrescrever arquivos nos diretórios que aparecem anteriormente na lista - cp -f especifica a opção "sobrescrever força" para o programa de cópia. Isso pressupõe:

  • Nomes de diretório não contêm novas linhas. (Você não conseguiria listá-los em um arquivo de texto simples, se o fizesse.)
  • O arquivo de lista não contém citações.
  • Cada diretório tem apenas arquivos (simples), não subdiretórios ou coisas especiais.
  • Nenhum nome de arquivo começa com . .
por 03.06.2017 / 07:22
0
cp -r $(<sources) target/

deve funcionar.

Isso pressupõe que os caminhos estejam listados no arquivo sources .

Cada caminho pode ser o de um diretório ou arquivo, mas nenhum caminho no arquivo sources pode conter qualquer espaço em branco (espaço, tabulação, nova linha, etc.) ou caractere de globalização (como * ou ? ), e eles não devem ser citados (a menos que o nome real contenha uma citação).

Você também pode usar algo como

xargs -t -Isrc cp -r src target/ <sources

Isso permitiria nomes de arquivos mais exóticos, mas não para nomes de arquivos com novas linhas.

O seguinte é um pequeno script bash que converte um conjunto de nomes de arquivos em letras minúsculas (o echo deve ser removido para realizar uma renomeação real, está lá para que você possa ver o que aconteceria).

#!/bin/bash

for path in "$@"; do
    dir="${path%/*}"
    name="${path##*/}"

    if [[ ! "$path" -ef "$dir/${name,,}" ]]; then
        echo mv "$path" "$dir/${name,,}"
    fi
done

O -ef test retorna true se os dois caminhos se referirem ao mesmo arquivo (caso em que a renomeação não deve acontecer). A substituição da variável ${name,,} é o que faz o revestimento inferior real.

Você pode aplicar isso a um diretório como este:

$ find target -type f -exec bash tolower.sh {} +
    
por 03.06.2017 / 08:41