Comment copier des fichiers du dossier sans le dossier lui-même

40

Je suis en train de copier des fichiers et sous - dossiers Un dossier sans A lui - même. Par exemple, Un dossier contient ensuite:

| file1.txt   
| file2.txt    
| subfolder1   

L'exécution de la commande suivante me donne un résultat erroné:

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

Le résultat est

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

au lieu de..

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

Comment puis-je atteindre celui attendu sans origin-folder

pushandpop
la source

Réponses:

67

cp avancé

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

Ceci est particulièrement intéressant car cela fonctionne que le répertoire cible existe déjà ou non.

coquille

S'il n'y a pas trop d'objets dans le répertoire, vous pouvez utiliser l'écroulement du shell:

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/

La /fin du chemin source est importante; fonctionne que le répertoire cible existe déjà ou non.

trouver

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

ou si vous n'avez pas besoin de sous-répertoires vides:

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

(sans mkdir)

Hauke ​​Laging
la source
Le premier fonctionne très bien! Des idées pour lesquelles home / nom d'utilisateur / A / * (avec le symbole étoile) n'a pas de sens? La variante avec le point à la fin m'a aidé, merci!
Pushandpop
@pushandpop a du A/*sens, mais il y a des situations dans lesquelles cela ne fonctionne pas.
Hauke ​​Laging
3
shoptest bashspécifique. Avec zsh, utilisez *(D). avec ksh93, FIGNORE='@(.|..)'. cp -test spécifique à GNU. Celui- findci ne fonctionnera pas correctement car il copiera plusieurs fois A/son contenu (y compris les sous-répertoires).
Stéphane Chazelas
1
Vous voulez aussi -maxdepth 1( -mindepthet -maxdepthétant des extensions GNU maintenant également supporté par quelques autres. Portable find .../. ! -name . -prune -exec ....)
Stéphane Chazelas
@ StéphaneChazelas Je suppose qu'il y a une faute de frappe quelque part. find .../.provoque une erreur ici.
Hauke ​​Laging
10

Si vous êtes sur un système GNU, à partir de man cp:

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

Cela vous permet d'écrire cp -rT /home/username/A/ /usr/lib/B/pour faire exactement ce qu'il faut.

michas
la source
Cela devrait être la réponse acceptée, cela est approprié que d'écraser un shell ou d'utiliser autre chose que cp. Mais c'est vrai que -Tcela ne fonctionnera pas avec un non-GNU cp.
noraj
3

Dites cpde copier le contenu du répertoire et non le répertoire lui-même:

sudo cp -r /home/username/A/* /usr/lib/B/
terdon
la source
Merci! Mais il dit: / usr / lib / B / n'est pas un répertoire
pushandpop
Vous devrez pour shopt -s dotglobque cela fonctionne s'il y a des fichiers point dans /home/username/A/.
parle le
1
@pushandpop bien, oui. C'est la cible que vous aviez dans votre question, alors j'ai supposé que c'était un répertoire. Vous devez créer la cible avant de tenter d'y copier des fichiers.
terdon