web-dev-qa-db-fra.com

Copier des fichiers d'un répertoire dans un sous-répertoire (à l'exclusion du sous-répertoire lui-même)

J'ai créé un dossier (répertoire) nommé Parent contenant plusieurs fichiers (à savoir file1file2 ... file100) et des sous-répertoires (Folder2, Folder3 etc) et un sous-répertoire particulier nommé Child1 qui peut contenir des fichiers et des dossiers. Maintenant, je veux copier tout le contenu de Parent à l'exception de Child1 dans le dossier Child1.

Le contenu final de 'Child1' devrait ressembler à ceci:

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

Comment puis-je atteindre cet objectif?

3
tHe_VaGaBonD

En supposant que vous utilisez bash comme shell interactif, vous pouvez activer extglob , ce qui vous permet de spécifier "tous les fichiers sauf ceux-ci".

shopt -s extglob
cd Parent
cp !(Child1) Child1/
4
geirha

Trois excellentes réponses qui démontrent la flexibilité de Linux. Et il est toujours bon de se familiariser avec les opérations de base en ligne de commande. Personnellement, je préfère une approche hybride et j'essaie d'utiliser mc (minuit commandant) lorsqu'il est disponible.

Sudo apt-get install mc

l'obtenir pour vous. Les tyrannosaures survivants comme moi pourraient remarquer la ressemblance avec le commandant Norton du temps du DOS. Son fonctionnement est assez intuitif. Vous avez deux panneaux. Vous basculez entre eux avec la tabulation. Il existe des raccourcis clavier Fn pour les opérations de base, comme afficher, éditer, copier, déplacer, renommer, supprimer, etc.

mc

Dans votre cas, tout ce que vous avez à faire est de taper mc dans la fenêtre de votre terminal et de naviguer vers le dossier Parent dans un panneau et le dossier enfant dans l’autre. Sélectionnez ensuite le panneau parent et appuyez sur +, puis entrez. Cela sélectionnera tous les fichiers et dossiers du panneau. Avec les touches fléchées, allez au-dessus du dossier Child1 et appuyez sur la touche Ins. Ceci désélectionnera ce dossier (la touche Insp permet de sélectionner l’état d’un élément.) Appuyez maintenant sur F5 pour copier tout le contenu sélectionné dans l’autre panneau (situé dans le dossier Child1).

Je fournis ces informations uniquement dans un souci d'exhaustivité et pour démontrer davantage la diversité des solutions disponibles. Bien entendu, continuez et apprenez les commandes de base de Linux et leurs variations. Vous pouvez toujours compter sur leur disponibilité au bout des doigts sur n’importe quel système.

3
hmayag

Moins élégant que extglob, mais fonctionne aussi ...

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

Supprimez echo après le test pour déplacer réellement les fichiers. Si vous avez des fichiers cachés et que vous voulez les inclure, lancez d'abord shopt -s dotglob.

En tant que script (encore une fois, vous devez supprimer echo pour réellement déplacer des fichiers):

#!/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
1
Zanna

Essayez:

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

Il y aura un message indiquant que cp a omis le répertoire "Child1".

1
Manuel

Le moyen le plus simple est de déplacer le répertoire Child1 ailleurs, temporairement:

cd Parent
mv Child1 ..
mv * ../Child1
mv ../Child1 .
1
waltinator

rsync dispose d'une option permettant d'exclure des fichiers ou des répertoires à l'aide de l'option --exclude.

Donc, dans ce cas, je pense que rsync serait un bon choix.

mkdir -p Child1; rsync -av --progress ./* Child1 --exclude Child1
1
Rooney

Si les fichiers s'appellent réellement 'fichier1' etc., vous pouvez le faire:

cd Parent
cp file* Child1/

Sinon, vous devrez lister les fichiers dans la commande cp.

0
lenz