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/
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?
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.
Tente:
cd [WhereeverParentLies]
cp ./* ./Child1/
Haverá uma mensagem informando que o cp omitiu o diretório "Child1".
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
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
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.
A maneira mais simples é mover o diretório Child1
para outro lugar, temporariamente:
cd Parent
mv Child1 ..
mv * ../Child1
mv ../Child1 .
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
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