Je voudrais copier tous les fichiers d'un répertoire à l'exception d'un nommé Default.png. Il semble qu'il existe plusieurs façons de procéder. Qu'est-ce qui vous semble le plus efficace?
Pourquoi en avez-vous besoin pour ignorer ce fichier, au lieu de simplement le supprimer après l'avoir copié? Existe-t-il déjà dans le répertoire cible?
Lasse V. Karlsen
1
Oui, un fichier du même nom se trouve déjà dans le répertoire cible.
Joe Cannatti
@ LasseV.Karlsen: Ou vous pouvez gagner du temps pour le copier, s'il s'agit d'un gros fichier. Je suis intéressé par cela mais en excluant un répertoire plutôt qu'un fichier.
Nikana Reklawyks
Réponses:
54
Simple, s'il src/ne contient que des fichiers:
find src/!-name Default.png -exec cp -t dest/{}+
Si src/a des sous-répertoires, cela les omet, mais copie les fichiers à l'intérieur d'eux:
find src/-type f !-name Default.png -exec cp -t dest/{}+
Si src/a des sous-répertoires, cela ne les réintègre pas:
find src/-type f -maxdepth 1!-name Default.png -exec cp -t dest/{}+
Cela s'avère être le meilleur pour moi car il semblerait que OS X soit livré sans glob activé.
Joe Cannatti
6
@Max \;exécute la commande une fois par fichier. +exécute la commande une fois et lui transmet tous les noms de fichiers à la fois (sous réserve de la limite de longueur de la ligne de commande). +est un peu plus efficace en général.
John Kugelman
149
Devrait être comme suit:
cp -r !(Default.png)/dest
Si vous copiez dans un dossier imbriqué dans le dossier actuel (appelé exemple dans le cas ci-dessous), vous devez également omettre ce répertoire:
Copiez-vous les fichiers dans un dossier imbriqué dans le dossier à partir duquel vous effectuez la copie?
Jon
47
Cela nécessite shopt -s extglobde fonctionner, s'il a été désactivé.
Barry Kelly
5
Il semble que OS X doit être utilisé shopt -s extglobcomme décrit par @BarryKelly. Avec cela, cela fonctionne parfaitement.
Kat
Des années sur Bash et je ne savais pas !()... Magnifique! Pour ceux qui - comme moi - estiment qu'il est temps d'étudier / revoir bash , voici les liens pertinents liés à cette question / réponse: shopt / extglob et le modèle .
Brandt
73
rsync a été mon remplaçant cp / scp depuis longtemps:
La première commande n'est pas ce que l'OP a demandé. S'il Default.pngexiste dans les deux répertoires, il remplacera celui dans destdirpar celui dans srcdir, puis supprimera le copié Default.png. Au lieu de cela, l'OP souhaite conserver le Default.pngqui existe déjà destdir.
SnowFrog
2
que diriez-vous de default.png existe déjà dans destdir? Votre solutioun ne fonctionnera pas.
Iman Mohamadi
2
Cela fonctionne très bien pour tout copier sauf les modules de nœuds :) profitez-en et grâce aux réponses ci-dessus, je viens de l'ajouter. Rsync est meilleur à mon avis que CP car vous pouvez voir la barre de progression sans la demander.
Bienvenue à SO. Malheureusement, votre réponse n'est pas correcte. L'expression entre crochets ( [...]) contient un ensemble de caractères à faire correspondre, tandis qu'un début ^provoquera une correspondance du complément des caractères répertoriés. Dans l'exemple suivant, aucun fichier ne sera répertorié: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*parce que tous les noms de fichiers commençant par l' un des caractères suivants seront exclus: _cefilnopty.
Réponses:
Simple, s'il
src/
ne contient que des fichiers:Si
src/
a des sous-répertoires, cela les omet, mais copie les fichiers à l'intérieur d'eux:Si
src/
a des sous-répertoires, cela ne les réintègre pas:la source
\;
exécute la commande une fois par fichier.+
exécute la commande une fois et lui transmet tous les noms de fichiers à la fois (sous réserve de la limite de longueur de la ligne de commande).+
est un peu plus efficace en général.Devrait être comme suit:
Si vous copiez dans un dossier imbriqué dans le dossier actuel (appelé exemple dans le cas ci-dessous), vous devez également omettre ce répertoire:
la source
shopt -s extglob
de fonctionner, s'il a été désactivé.shopt -s extglob
comme décrit par @BarryKelly. Avec cela, cela fonctionne parfaitement.!()
... Magnifique! Pour ceux qui - comme moi - estiment qu'il est temps d'étudier / revoir bash , voici les liens pertinents liés à cette question / réponse: shopt / extglob et le modèle .rsync a été mon remplaçant cp / scp depuis longtemps:
la source
-r
argument si vous synchronisez des répertoiresJe ferais juste:
sauf si les fichiers sont volumineux. Sinon, utilisez par exemple
la source
Default.png
existe dans les deux répertoires, il remplacera celui dansdestdir
par celui danssrcdir
, puis supprimera le copiéDefault.png
. Au lieu de cela, l'OP souhaite conserver leDefault.png
qui existe déjàdestdir
.Cela fonctionne très bien pour tout copier sauf les modules de nœuds :) profitez-en et grâce aux réponses ci-dessus, je viens de l'ajouter. Rsync est meilleur à mon avis que CP car vous pouvez voir la barre de progression sans la demander.
la source
la source
la source
utiliser le paramètre d'expansion du shell avec regex
Tout sera copié à l'exception du not_to_copy_file
- si quelque chose ne va pas avec cela. veuillez préciser !
la source
[...]
) contient un ensemble de caractères à faire correspondre, tandis qu'un début^
provoquera une correspondance du complément des caractères répertoriés. Dans l'exemple suivant, aucun fichier ne sera répertorié:touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*
parce que tous les noms de fichiers commençant par l' un des caractères suivants seront exclus:_cefilnopty
.