Como copiar arquivos da pasta sem a própria pasta

39

Estou tentando copiar arquivos e subpastas da pasta A sem o próprio A. Por exemplo, uma pasta contém a seguir:

| file1.txt   
| file2.txt    
| subfolder1   

Executar o próximo comando me dá um resultado errado:

sudo cp -r /home/username/A/ /usr/lib/B/

O resultado é

/usr/lib/B/A/...copied files...

ao invés de..

/usr/lib/B/...copied files...

Como posso alcançar o esperado sem a pasta de origem

pushandpop
fonte

Respostas:

67

cp avançado

cp -r /home/username/A/. /usr/lib/B/

Isso é especialmente bom porque funciona, não importa se o diretório de destino já existe.

globbing shell

Se não houver muitos objetos no diretório, você poderá usar o shell globbing:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

O /no final do caminho de origem é importante; funciona, não importa se o diretório de destino já existe.

encontrar

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

ou se você não precisar de subdiretórios vazios:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(sem mkdir)

Hauke ​​Laging
fonte
O primeiro funciona muito bem! Alguma idéia de por que home / nome de usuário / A / * (com símbolo de estrela) não faz sentido? Variante com ponto no final me ajudou, obrigado!
Pushandpop
@pushandpop A/*faz sentido, mas há situações em que não funciona.
Hauke ​​Laging
3
shopté bashespecífico. Com zsh, use *(D). com ksh93, FIGNORE='@(.|..)'. cp -té específico do GNU. A findpessoa não vai funcionar convenientemente, uma vez que irá copiar ambos A/e seu conteúdo (incluindo subdiretórios) várias vezes.
Stéphane Chazelas
1
Você também quer -maxdepth 1( -mindepthe -maxdepthsendo extensões GNU agora também apoiado por alguns outros portably. find .../. ! -name . -prune -exec ....)
Stéphane Chazelas
@ StéphaneChazelas Acho que há um erro de digitação em algum lugar. find .../.causa um erro aqui.
Hauke ​​Laging
10

Se estiver em um sistema GNU, de man cp:

   -T, --no-target-directory
          treat DEST as a normal file

Isso permite que você escreva cp -rT /home/username/A/ /usr/lib/B/para fazer exatamente a coisa certa.

michas
fonte
Esta deve ser a resposta aceita, isso é apropriado do que o shell globbing ou usar outra coisa que não cp. Mas é verdade que -Tnão funcionará com um não-GNU cp.
Noraj
3

Diga cppara copiar o conteúdo do diretório e não o próprio diretório:

sudo cp -r /home/username/A/* /usr/lib/B/
terdon
fonte
Obrigado! Mas diz: / usr / lib / B / não é um diretório
pushandpop
Será necessário que shopt -s dotglobisso funcione se houver algum arquivo de ponto /home/username/A/.
talkloud
1
@pushandpop bem, sim. Esse é o objetivo que você tinha na sua pergunta, então eu assumi que fosse um diretório. Você precisa criar o destino antes de tentar copiar arquivos nele.
terdon