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?
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?
Réponses:
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/ {} +
\;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:
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:
cp -r !(Default.png|example) /example
shopt -s extglobde fonctionner, s'il a été désactivé.
shopt -s extglobcomme 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:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-rargument si vous synchronisez des répertoires
Je ferais juste:
cp srcdir/* destdir/ ; rm destdir/Default.png
sauf si les fichiers sont volumineux. Sinon, utilisez par exemple
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
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.
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.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
utiliser le paramètre d'expansion du shell avec regex
cp /<path>/[^not_to_copy_file]* .
Tout sera copié à l'exception du not_to_copy_file
- si quelque chose ne va pas avec cela. veuillez préciser !
[...]) 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.