Copie os arquivos de um diretório para um subdiretório (excluindo o próprio subdiretório)

2

Eu criei uma pasta (diretório) chamada Parent que contém vários arquivos ( file1 file2 ... file100 ) e subdiretórios ( Folder2 , Folder3 etc) e um sub particular -diretório denominado Child1 , que pode conter arquivos e pastas. Agora, quero copiar todo o conteúdo de Parent , excluindo Child1 na pasta Child1 .

O conteúdo final de "Child1" deve ser algo assim:

 Old content of Child1
 file1 ... file100 + Folder2 Folder3 + etc.

Como posso conseguir isso?

    
por tHe_VaGaBonD 22.05.2013 / 09:57

9 respostas

4

Supondo que você esteja usando o bash como seu shell interativo, você pode ativar o extglob que permite especificar "todos os arquivos, exceto esses ".

shopt -s extglob
cd Parent
cp !(Child1) Child1/
    
por geirha 22.05.2013 / 15:23
3

Três excelentes respostas que demonstram a flexibilidade do linux. E é sempre uma boa ideia estar familiarizado com operações básicas de linha de comando. Pessoalmente, prefiro uma abordagem híbrida e tento usar o mc (midnight commander) quando estiver disponível.

sudo apt-get install mc

vai conseguir para você. Tiranossauros sobreviventes como eu podem notar a semelhança com o comandante Norton dos dias do DOS. Sua operação é bastante intuitiva. Você tem dois painéis. Você alterna entre eles com TAB. Existem atalhos de tecla Fn para operações básicas, como visualizar, editar, copiar, mover, renomear, excluir, etc.

No seu caso, tudo o que você precisa fazer é digitar mc na sua janela de terminal e navegar para a pasta Pai em um painel, pasta filha no outro. Em seguida, selecione o painel pai e pressione + e, em seguida, insira. Isso selecionará todos os arquivos e pastas no painel. Com as teclas de seta, acesse a pasta Child1 e pressione a tecla Ins. Isso desmarcará essa pasta (a tecla Ins alterna o status de seleção de um item.) Agora pressione F5 e todo o conteúdo selecionado será copiado para o outro painel (que está dentro da pasta Child1).

Estou fornecendo essas informações apenas para fins de integridade e para demonstrar ainda mais a variedade de soluções disponíveis. Por todos os meios, vá em frente e aprenda os comandos básicos do linux e suas variações. Você sempre pode confiar que eles estejam disponíveis na ponta do seu dedo em qualquer sistema.

    
por hmayag 22.05.2013 / 15:11
1

Tente:

cd [WhereeverParentLies]
cp ./* ./Child1/

Haverá uma mensagem informando que o cp omitiu o diretório "Child1".

    
por Manuel 22.05.2013 / 10:11
1

Menos elegante que extglob , mas também funciona ...

mkdir -p Child1; for i in ./*; do [[ "$i" != ./Child1 ]] && echo cp -vr "$i" Child; done
cp -vr ./file1 Child1
cp -vr ./file100 Child1
cp -vr ./Folder2 Child1
cp -vr ./Folder3 Child1

Remova echo após o teste para realmente mover os arquivos. Se você tiver arquivos ocultos e quiser incluí-los, execute primeiro shopt -s dotglob .

Como um script (novamente, você precisa remover echo para mover arquivos):

#!/bin/bash

mkdir -p Child1                    # create Child1 if it does not exist
for i in ./*; do                   # act on all the files in the current directory 
   [[ "$i" != ./Child1 ]] &&       # if the file is not Child1 itself
   echo cp -vr "$i" Child1         # move the file into Child1
done
    
por Zanna 12.12.2017 / 15:40
1

rsync tem uma opção para excluir arquivos ou diretórios usando a opção --exclude .

Portanto, neste caso, acho que rsync seria uma boa escolha.

mkdir -p Child1; rsync -av --progress ./* Child1 --exclude Child1
    
por Rooney 13.12.2017 / 10:32
0

Se os arquivos são realmente chamados de 'arquivo1' etc., você pode fazer isso:

cd Parent
cp file* Child1/

Caso contrário, você terá que listar os arquivos no comando cp.

    
por lenz 22.05.2013 / 10:09
0

A maneira mais simples é mover o diretório Child1 para outro lugar, temporariamente:

cd Parent
mv Child1 ..
mv * ../Child1
mv ../Child1 .
    
por waltinator 13.12.2017 / 15:22
-1
find Parent/ -maxdepth 1 -type f | xargs cp -t Parent/Child/

Isso encontra todos os arquivos (excluindo o diretório) dentro do diretório pai / pai e copia cada um desses arquivos para pai / filho

find

    -type f match file only
    -maxdepth 1 find only in the Parent/ directory, do not find in directories inside Parent

cp

    -t target the directory where you want to copy the files
    
por llt 22.05.2013 / 10:15
-3

Você pode usar ls para listar o conteúdo de "Pai",

canaliza o resultado para grep -v para filtrar "Child1",

e envie a lista resultante para cp .

Isso deve funcionar: (de dentro do diretório "Parent")

cp 'ls | grep -v '^Child1$'' Child1
    
por Eitan Levine 21.06.2017 / 10:07