Copie e renomeie a colisão

0

Gostaria de mesclar o conteúdo dessas pastas com uma linha de comando.

.
├── folder1
│   │ file.txt
│
├── folder2
│   │ file.txt
│
└───folder3
    │ file.txt

Como posso fazer isso?

    
por Ghilas BELHADJ 20.05.2016 / 11:04

2 respostas

1

O seguinte loop de linha de comando copiará o conteúdo (de nível superior) de cada pasta chamada "pasta *" em seu diretório atual em um diretório chamado "new_directory". O /* glob, por padrão, não corresponderá a "arquivos de ponto"; use shopt -s dotglob se você quiser mudar esse comportamento. Se o mesmo nome de arquivo (base) já existir em new_directory, ele prefixará o arquivo de destino com a pasta de origem (e um sublinhado), para torná-lo exclusivo.

Tudo em uma linha:

for f in folder*/*; do [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }; [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"; done

Separado por legibilidade:

for f in folder*/*
do 
  [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }
  [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"
done

Se você pretende, em vez disso, mover os arquivos de seus locais originais, basta alterar os cp para mv .

    
por 26.05.2016 / 16:41
0

Por fim, posso fazer isso com cp e seu --backup sinalizar.

cp --backup=numbered */*.txt new_directory/
    
por 20.05.2016 / 12:09

Tags