3 votes

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

J'ai créé un dossier (répertoire) nommé Parent qui contient plusieurs fichiers (à savoir file1 file2 ... file100 ) et les sous-répertoires ( Folder2 , Folder3 etc.) et un sous-répertoire particulier nommé Child1 qui peut elle-même contenir des fichiers et des dossiers. Je veux maintenant copier tout le contenu de Parent à l'exclusion Child1 dans le dossier Child1 .

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

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

Comment y parvenir ?

4voto

Steve Karg Points 11

Si vous utilisez bash comme Shell interactif, vous pouvez activer les options suivantes extglob qui vous permet de spécifier "tous les fichiers sauf ceux-là".

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

3voto

hmayag Points 2188

Trois excellentes réponses qui démontrent la flexibilité de linux. Et c'est toujours une bonne idée 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 (midnight commander) lorsqu'il est disponible.

sudo apt-get install mc

l'obtiendra pour vous. Les tyrannosaures survivants comme moi pourraient remarquer la ressemblance avec Norton commander de l'époque DOS. Son fonctionnement est assez intuitif. Vous disposez de deux panneaux. Vous passez de l'un à l'autre à l'aide de la touche TAB. 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 votre fenêtre de terminal et de naviguer vers le dossier parent dans un panneau, le dossier enfant dans l'autre. Sélectionnez ensuite le panneau parent et appuyez sur + puis sur entrée. Cela sélectionnera tous les fichiers et dossiers du panneau. Avec les touches fléchées, allez en haut du dossier Child1 et appuyez sur la touche Ins. Appuyez maintenant sur F5 et tout le contenu sélectionné sera copié dans l'autre panneau (qui se trouve dans le dossier Child1).

Je ne fournis ces informations que dans un souci d'exhaustivité et pour mieux démontrer la variété des solutions disponibles. N'hésitez pas à apprendre les commandes de base de Linux et leurs variantes. Vous pouvez toujours compter sur le fait qu'elles sont disponibles du bout des doigts sur n'importe quel système.

1voto

Zanna Points 65764

Moins élégant que extglob mais fonctionne également...

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

Retirer echo après avoir testé le déplacement des fichiers. Si vous avez des fichiers cachés et que vous souhaitez les inclure, exécutez d'abord la commande shopt -s dotglob .

En tant que script (encore une fois, vous devez enlever echo pour 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

1voto

Rooney Points 935

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

Dans ce cas, je pense donc que rsync serait un bon choix.

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

1voto

Manuel Points 1437

Essayez :

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X