J'ai créé un dossier (répertoire) nommé Parent
contenant plusieurs fichiers (à savoir file1
file2
... 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?
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/
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.
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.
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
Essayez:
cd [WhereeverParentLies]
cp ./* ./Child1/
Il y aura un message indiquant que cp a omis le répertoire "Child1".
Le moyen le plus simple est de déplacer le répertoire Child1
ailleurs, temporairement:
cd Parent
mv Child1 ..
mv * ../Child1
mv ../Child1 .
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
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.