Compare commits
9 Commits
28e8089316
...
07f53e4109
Author | SHA1 | Date |
---|---|---|
Matteo Cypriani | 07f53e4109 | |
Matteo Cypriani | 35b8fed792 | |
Matteo Cypriani | 63870b25ed | |
Matteo Cypriani | 93c37d756d | |
Matteo Cypriani | 7bff021cd3 | |
Matteo Cypriani | 81bd453526 | |
Matteo Cypriani | 43da9301fa | |
Matteo Cypriani | 0995d580c9 | |
Matteo Cypriani | 007d04dd16 |
|
@ -1,10 +1,11 @@
|
||||||
gcp 0.2.0 (UNRELEASED, Matteo Cypriani):
|
gcp 0.2.0 (2018-10-14, Matteo Cypriani):
|
||||||
- actually switch to Python3
|
- actually switch to Python3
|
||||||
- cp compatibibility:
|
- cp compatibibility:
|
||||||
+ don't preserve any attributes by default (Jingbei Li)
|
+ don't preserve any attributes by default (Jingbei Li)
|
||||||
+ added -p switch (same as --preserve=mode,ownership,timestamps)
|
+ added -p switch (same as --preserve=mode,ownership,timestamps)
|
||||||
+ added -R switch (same as --recursive)
|
+ added -R switch (same as --recursive)
|
||||||
- new --fs-fix option
|
- new --fix-filenames option
|
||||||
|
- reworked packaging
|
||||||
|
|
||||||
gcp 0.1.4.dev1 (unreleased, Jingbei Li):
|
gcp 0.1.4.dev1 (unreleased, Jingbei Li):
|
||||||
- main Python3 migration work
|
- main Python3 migration work
|
||||||
|
|
16
README.md
16
README.md
|
@ -1,7 +1,8 @@
|
||||||
gcp
|
gcp
|
||||||
===
|
===
|
||||||
|
|
||||||
gcp (Goffi's cp) is a file copier.
|
gcp is a user-friendly file copier written in Python. Its name used to stand
|
||||||
|
for "Goffi's CoPier", but was changed into a recursive acronym: Gcp CoPier.
|
||||||
|
|
||||||
|
|
||||||
License
|
License
|
||||||
|
@ -51,16 +52,17 @@ Installing
|
||||||
The Python way
|
The Python way
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
pip3 install gcp
|
First, install the following packages on your system (these Debian packages
|
||||||
|
names, they may be different on other distros/systems):
|
||||||
Note that you should have the following packages installed so that pip can
|
|
||||||
complete the installation (Debian packages names, but you get the idea):
|
|
||||||
- libdbus-1-dev
|
- libdbus-1-dev
|
||||||
- libdbus-glib-1-dev
|
- libdbus-glib-1-dev
|
||||||
- libgirepository1.0-dev
|
- libgirepository1.0-dev
|
||||||
- libcairo2-dev
|
- libcairo2-dev
|
||||||
- python3-cairo-dev
|
- python3-cairo-dev
|
||||||
|
|
||||||
|
Then install gcp with pip:
|
||||||
|
pip3 install gcp
|
||||||
|
|
||||||
On Debian-based systems
|
On Debian-based systems
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
@ -145,9 +147,9 @@ Big thanks to contributors and package maintainers.
|
||||||
Contributors
|
Contributors
|
||||||
============
|
============
|
||||||
|
|
||||||
* Original author: Jérôme Poisson aka Goffi <goffi@goffi.org> 2010-2011.
|
* Original author: Jérôme Poisson a.k.a. Goffi <goffi@goffi.org> 2010-2011.
|
||||||
* Thomas Preud'homme <robotux@celest.fr> 2011: manpage, stat resolution fix.
|
* Thomas Preud'homme <robotux@celest.fr> 2011: manpage, stat resolution fix.
|
||||||
* Jingbei Li aka petronny 2016: conversion to Python3.
|
* Jingbei Li a.k.a. petronny 2016: conversion to Python3.
|
||||||
* Matteo Cypriani <mcy@lm7.fr> 2018: `--fs-fix` option, Python3 fixes.
|
* Matteo Cypriani <mcy@lm7.fr> 2018: `--fs-fix` option, Python3 fixes.
|
||||||
|
|
||||||
|
|
||||||
|
|
189
fr.po
189
fr.po
|
@ -1,36 +1,40 @@
|
||||||
# gcp -- French translation file
|
# gcp -- French translation file
|
||||||
|
#
|
||||||
# Copyright:
|
# Copyright:
|
||||||
# 2010 Jérôme Poisson (Goffi) <goffi@goffi.org>
|
# 2010 Jérôme Poisson (Goffi) <goffi@goffi.org>
|
||||||
# 2018 Matteo Cypriani <mcy@lm7.fr>
|
# 2018 Matteo Cypriani <mcy@lm7.fr>
|
||||||
|
#
|
||||||
# This file is distributed under the same license as the gcp package.
|
# This file is distributed under the same license as the gcp package.
|
||||||
#, fuzzy
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.2.0\n"
|
"Project-Id-Version: 0.2.0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-09-30 18:05+0800\n"
|
"POT-Creation-Date: 2010-09-30 18:05+0800\n"
|
||||||
"PO-Revision-Date: 2018-04-22 20:35+0200\n"
|
"PO-Revision-Date: 2018-10-14 20:56+0200\n"
|
||||||
"Last-Translator: Matteo Cypriani <mcy@lm7.fr>\n"
|
"Last-Translator: Matteo Cypriani <mcy@lm7.fr>\n"
|
||||||
"Language: French\n"
|
"Language: fr\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"X-Generator: Poedit 2.2\n"
|
||||||
|
|
||||||
#: gcp:45
|
#: gcp:46
|
||||||
msgid "Error during import"
|
msgid "Error during import"
|
||||||
msgstr "Erreur pendant l'import de bibliothèques"
|
msgstr "Erreur pendant l'import de bibliothèques"
|
||||||
|
|
||||||
#: gcp:46
|
#: gcp:47
|
||||||
msgid "Please check dependecies:"
|
msgid "Please check dependecies:"
|
||||||
msgstr "Merci de vérifier les dépendances :"
|
msgstr "Merci de vérifier les dépendances :"
|
||||||
|
|
||||||
#: gcp:52
|
#: gcp:54
|
||||||
msgid "ProgressBar not available, please download it at https://pypi.org/"
|
msgid "ProgressBar not available, please download it at https://pypi.org/"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ProgressBar n'est pas disponible, merci de le télécharger depuis"
|
"ProgressBar n'est pas disponible, merci de le télécharger depuishttps://pypi."
|
||||||
"https://pypi.org/"
|
"org/"
|
||||||
|
|
||||||
#: gcp:3
|
#: gcp:55
|
||||||
msgid ""
|
msgid ""
|
||||||
"Progress bar deactivated\n"
|
"Progress bar deactivated\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
|
@ -38,238 +42,245 @@ msgstr ""
|
||||||
"Barre de progression désactivée\n"
|
"Barre de progression désactivée\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
|
|
||||||
#: gcp:88
|
#: gcp:90
|
||||||
msgid "Init DbusObject..."
|
msgid "Init DbusObject..."
|
||||||
msgstr "Initialisation de «DbusObject»"
|
msgstr "Initialisation de DbusObject..."
|
||||||
|
|
||||||
#: gcp:109
|
#: gcp:111
|
||||||
msgid "INTERNAL ERROR: invalid arguments"
|
msgid "INTERNAL ERROR: invalid arguments"
|
||||||
msgstr "ERREUR INTERNE : arguments invalides"
|
msgstr "ERREUR INTERNE : arguments invalides"
|
||||||
|
|
||||||
#: gcp:114
|
#: gcp:116
|
||||||
msgid "INTERNAL ERROR: invalid source_dir"
|
msgid "INTERNAL ERROR: invalid source_dir"
|
||||||
msgstr "ERREUR INTERNE : chemin source invalide"
|
msgstr "ERREUR INTERNE : chemin source invalide"
|
||||||
|
|
||||||
#: gcp:169
|
#: gcp:171
|
||||||
msgid "/!\\ THE FOLLOWING FILES WERE *NOT* SUCCESSFULY COPIED:"
|
msgid "/!\\ THE FOLLOWING FILES WERE *NOT* SUCCESSFULY COPIED:"
|
||||||
msgstr "/!\\ LES FICHIERS SUIVANTS N'ONT *PAS* ÉTÉ COPIÉS :"
|
msgstr "/!\\ LES FICHIERS SUIVANTS N'ONT *PAS* ÉTÉ COPIÉS :"
|
||||||
|
|
||||||
#: gcp:175
|
#: gcp:177
|
||||||
msgid "The following files were copied, but some errors happened:"
|
msgid "The following files were copied, but some errors happened:"
|
||||||
msgstr ""
|
msgstr "Les fichiers suivant ont été copiés, mais des erreurs sont survenues :"
|
||||||
"Les fichiers suivant ont été copiés, mais quelques erreurs sont survenues :"
|
|
||||||
|
|
||||||
#: gcp:181
|
#: gcp:183
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Please check journal: %s"
|
msgid "Please check journal: %s"
|
||||||
msgstr "Merci de vérifier le journal : %s"
|
msgstr "Merci de vérifier le journal : %s"
|
||||||
|
|
||||||
#: gcp:203
|
#: gcp:205
|
||||||
msgid "gcp launched"
|
msgid "gcp launched"
|
||||||
msgstr "gcp lancé"
|
msgstr "gcp lancé"
|
||||||
|
|
||||||
#: gcp:211
|
#: gcp:213
|
||||||
msgid "Init DBus..."
|
msgid "Init DBus..."
|
||||||
msgstr "Initialisation de Dbus..."
|
msgstr "Initialisation de DBus..."
|
||||||
|
|
||||||
#: gcp:241
|
#: gcp:244
|
||||||
msgid "Can't read mounts table"
|
msgid "Can't read mounts table"
|
||||||
msgstr "Impossible de lire la table des montages"
|
msgstr "Impossible de lire la table des montages"
|
||||||
|
|
||||||
#: gcp:248
|
#: gcp:251
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Adding to copy list: %(path)s ==> %(dest_path)s (%(fs_type)s)"
|
msgid "Adding to copy list: %(path)s ==> %(dest_path)s (%(fs_type)s)"
|
||||||
msgstr "Ajout à la liste des copies : %(path)s ==> %(dest_path)s (%(fs_type)s)"
|
msgstr "Ajout à la liste des copies : %(path)s ==> %(dest_path)s (%(fs_type)s)"
|
||||||
|
|
||||||
#: gcp:253
|
#: gcp:258
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Can't copy %(path)s: %(exception)s"
|
msgid "Can't copy %(path)s: %(exception)s"
|
||||||
msgstr "Impossible de copier %(path)s : %(exception)s"
|
msgstr "Impossible de copier %(path)s : %(exception)s"
|
||||||
|
|
||||||
#: gcp:280
|
#: gcp:286
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Can't append %(path)s to copy list: %(exception)s"
|
msgid "Can't append %(path)s to copy list: %(exception)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Impossible d'ajouter %(path)s à la liste des fichiers à copier : %(exception)s"
|
"Impossible d'ajouter %(path)s à la liste des fichiers à copier : "
|
||||||
|
"%(exception)s"
|
||||||
|
|
||||||
#: gcp:283
|
#: gcp:289
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Can't access %(dirpath)s: %(exception)s"
|
msgid "Can't access %(dirpath)s: %(exception)s"
|
||||||
msgstr "Impossible d'accéder à %(dirpath)s : %(exception)s"
|
msgstr "Impossible d'accéder à %(dirpath)s : %(exception)s"
|
||||||
|
|
||||||
#: gcp:295
|
#: gcp:301
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Invalid dest_path: %s"
|
msgid "Invalid dest_path: %s"
|
||||||
msgstr "Chemin de destination invalide : %s"
|
msgstr "Chemin de destination invalide : %s"
|
||||||
|
|
||||||
#: gcp:300
|
#: gcp:306
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "The path given in arg doesn't exist or is not accessible: %s"
|
msgid "The path given in arg doesn't exist or is not accessible: %s"
|
||||||
msgstr "Le chemin donné en argument n'existe pas ou n'est pas accessible : %s"
|
msgstr "Le chemin donné en argument n'existe pas ou n'est pas accessible : %s"
|
||||||
|
|
||||||
#: gcp:304
|
#: gcp:310
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "omitting directory \"%s\""
|
msgid "omitting directory \"%s\""
|
||||||
msgstr "Répertoire \"%s\" ignoré"
|
msgstr "répertoire \"%s\" ignoré"
|
||||||
|
|
||||||
#: gcp:329
|
#: gcp:348
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File [%s] already exists, skipping it!"
|
msgid "File [%s] already exists, skipping it!"
|
||||||
msgstr "Le fichier [%s] existe déjà, je le saute !"
|
msgstr "Le fichier [%s] existe déjà, je le saute !"
|
||||||
|
|
||||||
#: gcp:347
|
#: gcp:368
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "COPYING %(source)s ==> %(dest)s"
|
msgid "COPYING %(source)s ==> %(dest)s"
|
||||||
msgstr "COPIE %(source)s ==> %(dest)s"
|
msgstr "COPIE %(source)s ==> %(dest)s"
|
||||||
|
|
||||||
#: gcp:447
|
#: gcp:462
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f PiB"
|
msgid "%.2f PiB"
|
||||||
msgstr "%.2f Pio"
|
msgstr "%.2f Pio"
|
||||||
|
|
||||||
#: gcp:449
|
#: gcp:464
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f TiB"
|
msgid "%.2f TiB"
|
||||||
msgstr "%.2f Tio"
|
msgstr "%.2f Tio"
|
||||||
|
|
||||||
#: gcp:451
|
#: gcp:466
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f GiB"
|
msgid "%.2f GiB"
|
||||||
msgstr "%.2f Gio"
|
msgstr "%.2f Gio"
|
||||||
|
|
||||||
#: gcp:453
|
#: gcp:468
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f MiB"
|
msgid "%.2f MiB"
|
||||||
msgstr "%.2f Mio"
|
msgstr "%.2f Mio"
|
||||||
|
|
||||||
#: gcp:455
|
#: gcp:470
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f KiB"
|
msgid "%.2f KiB"
|
||||||
msgstr "%.2f Kio"
|
msgstr "%.2f Kio"
|
||||||
|
|
||||||
#: gcp:457
|
#: gcp:471
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%i B"
|
msgid "%i B"
|
||||||
msgstr "%i o"
|
msgstr "%i o"
|
||||||
|
|
||||||
#: gcp:465 gcp:470
|
#: gcp:479 gcp:485
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Copying %s"
|
msgid "Copying %s"
|
||||||
msgstr "Copie de %s"
|
msgstr "Copie de %s"
|
||||||
|
|
||||||
#: gcp:497 gcp:530
|
#: gcp:515 gcp:548
|
||||||
msgid ""
|
msgid ""
|
||||||
"No saved sources with this name, check existing names with --sources-list"
|
"No saved sources with this name, check existing names with --sources-list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Aucune sauvegarde de fichiers sources avec ce nom, veuillez vérifier les "
|
"Aucune sauvegarde de fichiers sources avec ce nom, veuillez vérifier les "
|
||||||
"listes existantes avec --sources-list"
|
"listes existantes avec --sources-list"
|
||||||
|
|
||||||
#: gcp:507
|
#: gcp:525
|
||||||
msgid "Saved sources:"
|
msgid "Saved sources:"
|
||||||
msgstr "Liste de sources sauvées :"
|
msgstr "Liste de sources sauvées :"
|
||||||
|
|
||||||
#: gcp:521
|
#: gcp:539
|
||||||
msgid ""
|
msgid ""
|
||||||
"There is already a saved sources with this name, skipping --sources-save"
|
"There is already a saved sources with this name, skipping --sources-save"
|
||||||
msgstr "Il y a déjà une liste de sources avec ce nom, --sources-save ignoré"
|
msgstr "Il y a déjà une liste de sources avec ce nom, --sources-save ignoré"
|
||||||
|
|
||||||
#: gcp:557
|
#: gcp:578
|
||||||
msgid "copy directories recursively"
|
|
||||||
msgstr "copier les répertoire récursivement"
|
|
||||||
|
|
||||||
#: gcp:561
|
|
||||||
msgid "force overwriting of existing files"
|
msgid "force overwriting of existing files"
|
||||||
msgstr "forcer le remplacement des fichiers déjà existants"
|
msgstr "forcer le remplacement des fichiers déjà existants"
|
||||||
|
|
||||||
#: gcp:565
|
#: gcp:582
|
||||||
|
msgid "always follow symbolic links in sources"
|
||||||
|
msgstr "toujours suivre les liens symboliques"
|
||||||
|
|
||||||
|
#: gcp:586
|
||||||
|
msgid "never follow symbolic links in sources"
|
||||||
|
msgstr "ne pas suivre les liens symboliques"
|
||||||
|
|
||||||
|
#: gcp:590
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "same as --preserve=%s"
|
msgid "same as --preserve=%s"
|
||||||
msgstr "raccourci pour --preserve=%s"
|
msgstr "raccourci pour --preserve=%s"
|
||||||
|
|
||||||
#: gcp:569
|
#: gcp:594
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"preserve specified attributes; accepted values: 'all', or one or more "
|
"preserve specified attributes; accepted values: 'all', or "
|
||||||
"amongst %s"
|
"one or more amongst %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"préserver les attributs spécifiés; valeurs acceptées : "
|
"préserver les attributs spécifiés; valeurs acceptées : 'all' ou un ou "
|
||||||
"'all' ou un ou plusieurs éléments parmi %s"
|
"plusieurs éléments parmi %s"
|
||||||
|
|
||||||
#: gcp:574
|
#: gcp:599
|
||||||
msgid "always follow symbolic links in sources"
|
msgid "copy directories recursively"
|
||||||
|
msgstr "copier les répertoire récursivement"
|
||||||
|
|
||||||
|
#: gcp:603
|
||||||
|
msgid "display what is being done"
|
||||||
|
msgstr "afficher les opérations effectuées"
|
||||||
|
|
||||||
|
#: gcp:614
|
||||||
|
msgid ""
|
||||||
|
"fix file names incompatible with the destination file "
|
||||||
|
"system (default: auto)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"corriger les noms de fichiers incompatibles avec le système de fichiers "
|
||||||
|
"cible (défaut : auto)"
|
||||||
|
|
||||||
#: gcp:578
|
#: gcp:619
|
||||||
msgid "never follow symbolic links in sources"
|
msgid ""
|
||||||
|
"[DEPRECATED] same as --fix-filename=no (overrides --fix-"
|
||||||
|
"filenames)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"[OBSOLÈTE] identique à --fix-filenames=no (--fix-filenames sera ignoré)"
|
||||||
|
|
||||||
#: gcp:586
|
#: gcp:624
|
||||||
msgid "fix filesystem name incompatibily (default: auto)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:590
|
|
||||||
msgid "same as --fs-fix=no (overrides --fs-fix)"
|
|
||||||
msgstr "raccourci pour --fs-fix=no (--fs-fix sera ignoré)"
|
|
||||||
|
|
||||||
#: gcp:594
|
|
||||||
msgid "disable progress bar"
|
msgid "disable progress bar"
|
||||||
msgstr "désactiver la barre de progression"
|
msgstr "désactiver la barre de progression"
|
||||||
|
|
||||||
#: gcp:598
|
#: gcp:631
|
||||||
msgid "Show what is currently done"
|
msgid "save sources arguments"
|
||||||
msgstr "afficher les opérations effectuées"
|
|
||||||
|
|
||||||
#: gcp:607
|
|
||||||
msgid "Save source arguments"
|
|
||||||
msgstr "sauvegarder la liste des fichiers source"
|
msgstr "sauvegarder la liste des fichiers source"
|
||||||
|
|
||||||
#: gcp:611
|
#: gcp:635
|
||||||
msgid "Save source arguments and replace memory if it already exists"
|
msgid "save sources arguments and replace memory if it already exists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"sauvegarder la liste des fichiers source et la remplacer si elle existe déjà"
|
"sauvegarder la liste des fichiers source et la remplacer si elle existe déjà"
|
||||||
|
|
||||||
#: gcp:615
|
#: gcp:639
|
||||||
msgid "Load source arguments"
|
msgid "load sources arguments"
|
||||||
msgstr "réutiliser les fichiers source à copier"
|
msgstr "réutiliser les fichiers source à copier"
|
||||||
|
|
||||||
#: gcp:619
|
#: gcp:643
|
||||||
msgid "delete saved sources"
|
msgid "delete saved sources list"
|
||||||
msgstr "supprimer la liste des fichiers source"
|
msgstr "supprimer la liste des fichiers source"
|
||||||
|
|
||||||
#: gcp:623
|
#: gcp:647
|
||||||
msgid "List names of saved sources"
|
msgid "list names of saved sources"
|
||||||
msgstr "afficher les noms des listes de fichiers source"
|
msgstr "afficher les noms des listes de fichiers source"
|
||||||
|
|
||||||
#: gcp:627
|
#: gcp:651
|
||||||
msgid "List names of saved sources and files in it"
|
msgid "list names of saved sources and files in it"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"afficher les noms des listes de fichiers sources, en incluant les fichiers "
|
"afficher les noms des listes de fichiers sources, en incluant les fichiers "
|
||||||
"qu'elles contiennent"
|
"qu'elles contiennent"
|
||||||
|
|
||||||
#: gcp:639
|
#: gcp:663
|
||||||
msgid "Progress bar is not available, deactivating"
|
msgid "Progress bar is not available, deactivating"
|
||||||
msgstr "La barre de progression n'est pas disponible, désactivation"
|
msgstr "La barre de progression n'est pas disponible, désactivation"
|
||||||
|
|
||||||
#: gcp:663
|
#: gcp:687
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Invalid --preserve value '%s'"
|
msgid "Invalid --preserve value '%s'"
|
||||||
msgstr "Valeur de --preserve invalide « %s »"
|
msgstr "Valeur de --preserve invalide « %s »"
|
||||||
|
|
||||||
#: gcp:690
|
#: gcp:714
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "There is already one instance of %s running, pluging to it"
|
msgid "There is already one instance of %s running, pluging to it"
|
||||||
msgstr "Il y a déjà une instance de %s lancée, je m'y connecte"
|
msgstr "Il y a déjà une instance de %s lancée, je m'y connecte"
|
||||||
|
|
||||||
#: gcp:696
|
#: gcp:720
|
||||||
msgid "Wrong number of arguments"
|
msgid "Wrong number of arguments"
|
||||||
msgstr "Nombre d'arguments invalide"
|
msgstr "Nombre d'arguments invalide"
|
||||||
|
|
||||||
#: gcp:698
|
#: gcp:722
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "adding args to gcp: %s"
|
msgid "adding args to gcp: %s"
|
||||||
msgstr "ajout des arguments à gcp : %s"
|
msgstr "ajout des arguments à gcp : %s"
|
||||||
|
|
||||||
#: gcp:707
|
#: gcp:731
|
||||||
msgid "User interruption: good bye"
|
msgid "User interruption: good bye"
|
||||||
msgstr "Interruption par l'utilisateur : au revoir"
|
msgstr "Interruption par l'utilisateur : au revoir"
|
||||||
|
|
||||||
|
|
130
gcp
130
gcp
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
"""
|
"""
|
||||||
gcp: Goffi's CoPier
|
gcp: Gcp CoPier
|
||||||
Copyright (c) 2010, 2011 Jérôme Poisson <goffi@goffi.org>
|
Copyright (c) 2010, 2011 Jérôme Poisson <goffi@goffi.org>
|
||||||
(c) 2011 Thomas Preud'homme <robotux@celest.fr>
|
(c) 2011 Thomas Preud'homme <robotux@celest.fr>
|
||||||
(c) 2016 Jingbei Li <i@jingbei.li>
|
(c) 2016 Jingbei Li <i@jingbei.li>
|
||||||
|
@ -55,7 +55,7 @@ except ImportError as e:
|
||||||
info (_('Progress bar deactivated\n--\n'))
|
info (_('Progress bar deactivated\n--\n'))
|
||||||
pbar_available=False
|
pbar_available=False
|
||||||
|
|
||||||
NAME = "gcp (Goffi's copier)"
|
NAME = "gcp (Gcp CoPier)"
|
||||||
NAME_SHORT = "gcp"
|
NAME_SHORT = "gcp"
|
||||||
VERSION = '0.2.0'
|
VERSION = '0.2.0'
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ class GCP():
|
||||||
@param path: absolute path of dir
|
@param path: absolute path of dir
|
||||||
@param options: options as return by optparse"""
|
@param options: options as return by optparse"""
|
||||||
#We first check that the dest path exists, and create it if needed
|
#We first check that the dest path exists, and create it if needed
|
||||||
dest_path = self.__filename_fix(dest_path, options, no_journal=True)
|
dest_path = self.__fix_filenames(dest_path, options, no_journal=True)
|
||||||
if not os.path.exists(dest_path):
|
if not os.path.exists(dest_path):
|
||||||
debug ("Creating directory %s" % dest_path)
|
debug ("Creating directory %s" % dest_path)
|
||||||
os.makedirs(dest_path) #TODO: check permissions
|
os.makedirs(dest_path) #TODO: check permissions
|
||||||
|
@ -340,10 +340,10 @@ class GCP():
|
||||||
filename = os.path.basename(source_file)
|
filename = os.path.basename(source_file)
|
||||||
assert(filename)
|
assert(filename)
|
||||||
if options.dest_file:
|
if options.dest_file:
|
||||||
dest_file = self.__filename_fix(options.dest_file, options)
|
dest_file = self.__fix_filenames(options.dest_file, options)
|
||||||
else:
|
else:
|
||||||
dest_file = self.__filename_fix(os.path.join(dest_path, filename),
|
dest_file = self.__fix_filenames(os.path.join(dest_path, filename),
|
||||||
options)
|
options)
|
||||||
if os.path.exists(dest_file) and not options.force:
|
if os.path.exists(dest_file) and not options.force:
|
||||||
warning (_("File [%s] already exists, skipping it!") % dest_file)
|
warning (_("File [%s] already exists, skipping it!") % dest_file)
|
||||||
self.journal.copyFailed()
|
self.journal.copyFailed()
|
||||||
|
@ -417,7 +417,7 @@ class GCP():
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
self._userInterruption()
|
self._userInterruption()
|
||||||
|
|
||||||
def __filename_fix(self, filename, options, no_journal=False):
|
def __fix_filenames(self, filename, options, no_journal=False):
|
||||||
"""Fix filenames incompatibilities/mistake according to options
|
"""Fix filenames incompatibilities/mistake according to options
|
||||||
@param filename: full path to the file
|
@param filename: full path to the file
|
||||||
@param options: options as parsed on command line
|
@param options: options as parsed on command line
|
||||||
|
@ -425,7 +425,7 @@ class GCP():
|
||||||
@return: fixed filename"""
|
@return: fixed filename"""
|
||||||
fixed_filename = filename
|
fixed_filename = filename
|
||||||
|
|
||||||
if options.fs_fix == 'force' or (options.fs_fix == 'auto' and self.getFsType(filename) == 'vfat'):
|
if options.fix_filenames == 'force' or (options.fix_filenames == 'auto' and self.getFsType(filename) == 'vfat'):
|
||||||
fixed_filename = filename.replace('\\','_')\
|
fixed_filename = filename.replace('\\','_')\
|
||||||
.replace(':',';')\
|
.replace(':',';')\
|
||||||
.replace('*','+')\
|
.replace('*','+')\
|
||||||
|
@ -561,8 +561,6 @@ class GCP():
|
||||||
_usage="""
|
_usage="""
|
||||||
%(prog)s [options] FILE DEST
|
%(prog)s [options] FILE DEST
|
||||||
%(prog)s [options] FILE1 [FILE2 ...] DEST-DIR
|
%(prog)s [options] FILE1 [FILE2 ...] DEST-DIR
|
||||||
|
|
||||||
%(prog)s --help for options list
|
|
||||||
"""
|
"""
|
||||||
for idx in range(len(full_args)):
|
for idx in range(len(full_args)):
|
||||||
full_args[idx] = full_args[idx].encode('utf-8')
|
full_args[idx] = full_args[idx].encode('utf-8')
|
||||||
|
@ -570,79 +568,87 @@ class GCP():
|
||||||
parser = ArgumentParser(usage=_usage,
|
parser = ArgumentParser(usage=_usage,
|
||||||
formatter_class=RawDescriptionHelpFormatter)
|
formatter_class=RawDescriptionHelpFormatter)
|
||||||
|
|
||||||
parser.add_argument("-r", "-R", "--recursive",
|
|
||||||
action="store_true", default=False,
|
|
||||||
help=_("copy directories recursively")
|
|
||||||
)
|
|
||||||
parser.add_argument("-f", "--force",
|
|
||||||
action="store_true", default=False,
|
|
||||||
help=_("force overwriting of existing files")
|
|
||||||
)
|
|
||||||
parser.add_argument("-p",
|
|
||||||
action="store_true", default=False,
|
|
||||||
help=_("same as --preserve=%s" % const_PRESERVE_p)
|
|
||||||
)
|
|
||||||
parser.add_argument("--preserve",
|
|
||||||
action="store", default='',
|
|
||||||
help=_("preserve specified attributes; accepted values: \
|
|
||||||
'all', or one or more amongst %s") % str(const_PRESERVE)
|
|
||||||
)
|
|
||||||
parser.add_argument("-L", "--dereference",
|
|
||||||
action="store_true", default=False,
|
|
||||||
help=_("always follow symbolic links in sources")
|
|
||||||
)
|
|
||||||
parser.add_argument("-P", "--no-dereference",
|
|
||||||
action="store_false", dest='dereference',
|
|
||||||
help=_("never follow symbolic links in sources")
|
|
||||||
)
|
|
||||||
#parser.add_argument("--no-unicode-fix",
|
|
||||||
# action="store_false", dest='unicode_fix', default=True,
|
|
||||||
# help=_("don't fix name encoding errors") #TODO
|
|
||||||
#)
|
|
||||||
parser.add_argument("--fs-fix",
|
|
||||||
choices = const_FS_FIX, dest='fs_fix', default='auto',
|
|
||||||
help=_("fix filesystem name incompatibily (default: auto)")
|
|
||||||
)
|
|
||||||
parser.add_argument("--no-fs-fix",
|
|
||||||
action="store_true", dest='no_fs_fix', default=False,
|
|
||||||
help=_("same as --fs-fix=no (overrides --fs-fix)")
|
|
||||||
)
|
|
||||||
parser.add_argument("--no-progress",
|
|
||||||
action="store_false", dest="progress", default=True,
|
|
||||||
help=_("disable progress bar")
|
|
||||||
)
|
|
||||||
parser.add_argument("-v", "--verbose",
|
|
||||||
action="store_true", default=False,
|
|
||||||
help=_("Show what is currently done")
|
|
||||||
)
|
|
||||||
parser.add_argument("-V", "--version",
|
parser.add_argument("-V", "--version",
|
||||||
action="version", version=ABOUT
|
action="version", version=ABOUT
|
||||||
)
|
)
|
||||||
|
|
||||||
|
group_cplike = parser.add_argument_group("cp-like options")
|
||||||
|
group_cplike.add_argument("-f", "--force",
|
||||||
|
action="store_true", default=False,
|
||||||
|
help=_("force overwriting of existing files")
|
||||||
|
)
|
||||||
|
group_cplike.add_argument("-L", "--dereference",
|
||||||
|
action="store_true", default=False,
|
||||||
|
help=_("always follow symbolic links in sources")
|
||||||
|
)
|
||||||
|
group_cplike.add_argument("-P", "--no-dereference",
|
||||||
|
action="store_false", dest='dereference',
|
||||||
|
help=_("never follow symbolic links in sources")
|
||||||
|
)
|
||||||
|
group_cplike.add_argument("-p",
|
||||||
|
action="store_true", default=False,
|
||||||
|
help=_("same as --preserve=%s" % const_PRESERVE_p)
|
||||||
|
)
|
||||||
|
group_cplike.add_argument("--preserve",
|
||||||
|
action="store", default='',
|
||||||
|
help=_("preserve specified attributes; accepted values: \
|
||||||
|
'all', or one or more amongst %s") % str(const_PRESERVE)
|
||||||
|
)
|
||||||
|
group_cplike.add_argument("-r", "-R", "--recursive",
|
||||||
|
action="store_true", default=False,
|
||||||
|
help=_("copy directories recursively")
|
||||||
|
)
|
||||||
|
group_cplike.add_argument("-v", "--verbose",
|
||||||
|
action="store_true", default=False,
|
||||||
|
help=_("display what is being done")
|
||||||
|
)
|
||||||
|
parser.add_argument_group(group_cplike)
|
||||||
|
|
||||||
|
group_gcpspecific = parser.add_argument_group("gcp-specific options")
|
||||||
|
#parser.add_argument("--no-unicode-fix",
|
||||||
|
# action="store_false", dest='unicode_fix', default=True,
|
||||||
|
# help=_("don't fix name encoding errors") #TODO
|
||||||
|
#)
|
||||||
|
group_gcpspecific.add_argument("--fix-filenames",
|
||||||
|
choices = const_FS_FIX, dest='fix_filenames', default='auto',
|
||||||
|
help=_("fix file names incompatible with the destination \
|
||||||
|
file system (default: auto)")
|
||||||
|
)
|
||||||
|
group_gcpspecific.add_argument("--no-fs-fix",
|
||||||
|
action="store_true", dest='no_fs_fix', default=False,
|
||||||
|
help=_("[DEPRECATED] same as --fix-filename=no (overrides \
|
||||||
|
--fix-filenames)")
|
||||||
|
)
|
||||||
|
group_gcpspecific.add_argument("--no-progress",
|
||||||
|
action="store_false", dest="progress", default=True,
|
||||||
|
help=_("disable progress bar")
|
||||||
|
)
|
||||||
|
parser.add_argument_group(group_gcpspecific)
|
||||||
|
|
||||||
group_saving = parser.add_argument_group("sources saving")
|
group_saving = parser.add_argument_group("sources saving")
|
||||||
group_saving.add_argument("--sources-save",
|
group_saving.add_argument("--sources-save",
|
||||||
action="store",
|
action="store",
|
||||||
help=_("Save source arguments")
|
help=_("save sources arguments")
|
||||||
)
|
)
|
||||||
group_saving.add_argument("--sources-replace",
|
group_saving.add_argument("--sources-replace",
|
||||||
action="store",
|
action="store",
|
||||||
help=_("Save source arguments and replace memory if it already exists")
|
help=_("save sources arguments and replace memory if it already exists")
|
||||||
)
|
)
|
||||||
group_saving.add_argument("--sources-load",
|
group_saving.add_argument("--sources-load",
|
||||||
action="store",
|
action="store",
|
||||||
help=_("Load source arguments")
|
help=_("load sources arguments")
|
||||||
)
|
)
|
||||||
group_saving.add_argument("--sources-del",
|
group_saving.add_argument("--sources-del",
|
||||||
action="store",
|
action="store",
|
||||||
help=_("delete saved sources")
|
help=_("delete saved sources list")
|
||||||
)
|
)
|
||||||
group_saving.add_argument("--sources-list",
|
group_saving.add_argument("--sources-list",
|
||||||
action="store_true", default=False,
|
action="store_true", default=False,
|
||||||
help=_("List names of saved sources")
|
help=_("list names of saved sources")
|
||||||
)
|
)
|
||||||
group_saving.add_argument("--sources-full-list",
|
group_saving.add_argument("--sources-full-list",
|
||||||
action="store_true", default=False,
|
action="store_true", default=False,
|
||||||
help=_("List names of saved sources and files in it")
|
help=_("list names of saved sources and files in it")
|
||||||
)
|
)
|
||||||
parser.add_argument_group(group_saving)
|
parser.add_argument_group(group_saving)
|
||||||
|
|
||||||
|
@ -663,7 +669,7 @@ class GCP():
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
|
||||||
if options.no_fs_fix:
|
if options.no_fs_fix:
|
||||||
options.fs_fix = 'no'
|
options.fix_filenames = 'no'
|
||||||
|
|
||||||
preserve = set()
|
preserve = set()
|
||||||
|
|
||||||
|
|
159
gcp.1
159
gcp.1
|
@ -2,7 +2,7 @@
|
||||||
.\" First parameter, NAME, should be all caps
|
.\" First parameter, NAME, should be all caps
|
||||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
.\" other parameters are allowed: see man(7), man(1)
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
.TH GCP 1 "June 04, 2011"
|
.TH GCP 1 "October 14, 2018"
|
||||||
.\" Please adjust this date whenever revising the manpage.
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
.\"
|
.\"
|
||||||
.\" Some roff macros, for reference:
|
.\" Some roff macros, for reference:
|
||||||
|
@ -15,6 +15,9 @@
|
||||||
.\" .br insert line break
|
.\" .br insert line break
|
||||||
.\" .sp <n> insert n+1 empty lines
|
.\" .sp <n> insert n+1 empty lines
|
||||||
.\" for manpage-specific macros, see man(7)
|
.\" for manpage-specific macros, see man(7)
|
||||||
|
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||||
|
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||||
|
.\" respectively.
|
||||||
.SH NAME
|
.SH NAME
|
||||||
gcp \- Advanced command-line file copier
|
gcp \- Advanced command-line file copier
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -28,77 +31,109 @@ gcp \- Advanced command-line file copier
|
||||||
.RI [ FILE2 ... ]
|
.RI [ FILE2 ... ]
|
||||||
.I DEST-DIR
|
.I DEST-DIR
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
This manual page documents briefly the
|
\fBgcp\fP is a file copier, loosely inspired by cp, but with high level
|
||||||
.B gcp
|
functionalities like:
|
||||||
command.
|
.IP \(bu 2
|
||||||
.PP
|
transfer progression indication
|
||||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
.IP \(bu
|
||||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
continuous copying when there is an issue: it skips the problematic file and
|
||||||
.\" respectively.
|
goes on
|
||||||
\fBgcp\fP is a file copier, loosely inspired by cp, but with high level functionalities like:
|
.IP \(bu
|
||||||
\- transfer progression indication
|
copy status logging: which files were effectively copied
|
||||||
\- continuous copying when there is an issue: it skips the problematic file and goes on
|
.IP \(bu
|
||||||
\- copy status logging: which files were effectively copied
|
name mangling to handle target filesystem limitations (e.g. removing
|
||||||
\- name mangling to handle target filesystem limitations (e.g. removing incompatible chars like "?" or "*" on vfat)
|
incompatible chars like "?" or "*" on FAT filesystems)
|
||||||
\- forced copy serialization: new files to copy are added to a global queue to avoid hard drive head seeks
|
.IP \(bu
|
||||||
\- transfer list management: gcp can save a list of files to copy and reuse it later
|
forced copy serialization: new files to copy are added to a global queue to
|
||||||
\- approximate option compatibility with cp (approximate because the behaviour is not exactly the same, see below)
|
avoid hard drive head seeks
|
||||||
|
.IP \(bu
|
||||||
|
transfer list management: gcp can save a list of files to copy and reuse it
|
||||||
|
later
|
||||||
|
.IP \(bu
|
||||||
|
approximate option compatibility with cp (approximate because the behaviour is
|
||||||
|
not exactly the same, see below)
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
These programs follow the usual GNU command line syntax, with long
|
These programs follow the usual GNU command line syntax, with long
|
||||||
options starting with two dashes (`-').
|
options starting with two dashes (`-').
|
||||||
By default, calling gcp is equivalent to calling gcp \-\-preserve=mode,ownership,timestamps.
|
|
||||||
.PP
|
.PP
|
||||||
A summary of options is included below.
|
A summary of options is included below.
|
||||||
.SS "General options"
|
.SS General options
|
||||||
.TP
|
|
||||||
.B \-\-version
|
|
||||||
Show version of program and exit.
|
|
||||||
.TP
|
.TP
|
||||||
.B \-h, \-\-help
|
.B \-h, \-\-help
|
||||||
Show summary of options.
|
Show summary of options.
|
||||||
.TP
|
.TP
|
||||||
.B \-r, \-R, \-\-recursive
|
.B \-V, \-\-version
|
||||||
Copy directories recursively.
|
Show program version and copyright information and exit.
|
||||||
.TP
|
.SS cp-like options
|
||||||
.B \-L, \-\-dereference
|
|
||||||
always follow symbolic links in sources
|
|
||||||
.TP
|
|
||||||
.B \-P, \-\-no\-dereference
|
|
||||||
never follow symbolic links in sources
|
|
||||||
.TP
|
.TP
|
||||||
.B \-f, \-\-force
|
.B \-f, \-\-force
|
||||||
Overwrite existing files.
|
Overwrite existing files.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-L, \-\-dereference
|
||||||
|
Always follow symbolic links in sources.
|
||||||
|
.TP
|
||||||
|
.B \-P, \-\-no\-dereference
|
||||||
|
Never follow symbolic links in sources.
|
||||||
|
.TP
|
||||||
.B \-p
|
.B \-p
|
||||||
Same as \-\-preserve=mode,ownership,timestamps
|
Same as \fB\-\-preserve=mode,ownership,timestamps\fP
|
||||||
.TP
|
.TP
|
||||||
.B \-\-preserve=PRESERVE
|
.B \-\-preserve=<\fIattributes\fP>
|
||||||
Keep specified attributes. Attributes can be mode, ownership and timestamps.
|
Preserve specified attributes. Attributes can be \fImode\fP, \fIownership\fP
|
||||||
When several attributes are passed, they need to be separated by commas. Note
|
and \fItimestamps\fP.
|
||||||
that timestamps preservation has some limits, see section LIMITATIONS.
|
When several attributes are passed, they need to be separated by commas.
|
||||||
|
Please note that timestamps preservation has some limits, see section
|
||||||
|
\fILIMITATIONS\fP.
|
||||||
.TP
|
.TP
|
||||||
.B \-\-no\-fs\-fix
|
.B \-r, \-R, \-\-recursive
|
||||||
Don't fix file system naming incompatibilities.
|
Copy directories recursively.
|
||||||
.TP
|
|
||||||
.B \-\-no\-progress
|
|
||||||
Disable progress bar.
|
|
||||||
.TP
|
.TP
|
||||||
.B \-v, \-\-verbose
|
.B \-v, \-\-verbose
|
||||||
Display what is being done.
|
Display what is being done.
|
||||||
.SS "Sources saving"
|
.SS gcp-specific options
|
||||||
.TP
|
.TP
|
||||||
.B \-\-sources\-save=SOURCES_SAVE
|
.B \-\-fix\-filenames=<\fIforce\fP|\fIauto\fP|\fIno\fP>
|
||||||
Save the list of source files in a list named SOURCES_SAVE.
|
gcp has the ability to modify the destination file name if the target file
|
||||||
|
system would not accept the original file name.
|
||||||
|
Offending characters will be replaced with similar-looking ones.
|
||||||
|
.IP
|
||||||
|
This option accept the following values:
|
||||||
|
.RS
|
||||||
.TP
|
.TP
|
||||||
.B \-\-sources\-replace=SOURCES_REPLACE
|
\fIauto\fP (default)
|
||||||
Save the list of source files in a list named SOURCES_REPLACE and
|
gcp will attempt to be smart, i.e. detect incompatibilities and fix them as-needed.
|
||||||
replace it if it already exists.
|
|
||||||
.TP
|
.TP
|
||||||
.B \-\-sources\-load=SOURCES_LOAD
|
\fIforce\fP
|
||||||
Reuse the list of source file named SOURCES_LOAD.
|
Always fix file names that could cause problems on any known filesystem or OS.
|
||||||
|
This is useful e.g. with NTFS, see \fINOTE ON NTFS\fP below.
|
||||||
.TP
|
.TP
|
||||||
.B \-\-sources\-del=SOURCES_DEL
|
\fIno\fP
|
||||||
Delete the list of source files named SOURCES_DEL.
|
Renaming is disabled entirely.
|
||||||
|
.RE
|
||||||
|
.IP
|
||||||
|
Currently, gcp is only aware of FAT incompatibilities:
|
||||||
|
\'\\\', \':\', \'*\', \'?\', \'"\', \'<\', \'>\' and \'|\'.
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-fs\-fix (DEPRECATED)
|
||||||
|
Same as \fB\-\-fix\-filenames=no\fP.
|
||||||
|
This option will be removed in a future release.
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-progress
|
||||||
|
Disable progress bar.
|
||||||
|
.SS Sources saving
|
||||||
|
.TP
|
||||||
|
.B \-\-sources\-save=\fISOURCES\fP
|
||||||
|
Save the list of source files in a list named \fISOURCES\fP.
|
||||||
|
.TP
|
||||||
|
.B \-\-sources\-replace=\fISOURCES\fP
|
||||||
|
Save the list of source files in a list named \fISOURCES\fP;
|
||||||
|
the file is overwritten it already exists.
|
||||||
|
.TP
|
||||||
|
.B \-\-sources\-load=\fISOURCES\fP
|
||||||
|
Use the list of source files named \fISOURCES\fP.
|
||||||
|
.TP
|
||||||
|
.B \-\-sources\-del=\fISOURCES\fP
|
||||||
|
Delete the list of source files named \fISOURCES\fP.
|
||||||
.TP
|
.TP
|
||||||
.B \-\-sources\-list
|
.B \-\-sources\-list
|
||||||
List the names of source file lists.
|
List the names of source file lists.
|
||||||
|
@ -108,21 +143,33 @@ List the names of source file lists, including their content.
|
||||||
.SH EXIT STATUS
|
.SH EXIT STATUS
|
||||||
The exit status can be:
|
The exit status can be:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\fB0\fP if files have been copied correctly or if another instance of gcp is already running and will do the copy.
|
\fB0\fP if files have been copied correctly or if another instance of gcp is
|
||||||
|
already running and will do the copy.
|
||||||
.IP \[bu]
|
.IP \[bu]
|
||||||
\fB1\fP if at least one file has not been copied, or if something went wrong.
|
\fB1\fP if at least one file has not been copied, or if something went wrong.
|
||||||
.IP \[bu]
|
.IP \[bu]
|
||||||
\fB2\fP if all files have been copied but with some issues
|
\fB2\fP if all files have been copied but with some issues
|
||||||
.SH LIMITATIONS
|
.SH LIMITATIONS
|
||||||
Timestamps preservation with \-\-preserve option is limited by the os python
|
Timestamps preservation with \fB\-\-preserve\fP option is limited by the
|
||||||
module on POSIX systems. Currently, python only returns timestamps in float
|
\fIos\fP Python module on POSIX systems. Currently, Python only returns
|
||||||
format, which is a smaller precision than what POSIX provides. Progress on this
|
timestamps in float format, which is a smaller precision than what POSIX
|
||||||
issue can be seen at http://bugs.python.org/issue11457.
|
provides. Progress on this issue can be seen at
|
||||||
|
http://bugs.python.org/issue11457.
|
||||||
|
.PP
|
||||||
|
The \fB\-\-preserve\fP option cannot currently be used without an attribute
|
||||||
|
list (\fBgcp \-\-preserve foo bar\fP will behave as \fBgcp \-\-preserve=foo
|
||||||
|
bar\fP). Use the \fB\-p\fP switch instead.
|
||||||
|
.SH NOTE ON NTFS
|
||||||
|
NTFS will not enforce the same file name limitations than FAT, but files that
|
||||||
|
would not be accepted on a FAT filesystem will still cause problems on Windows.
|
||||||
|
Hence, it is recommended to use \-\-fix-filenames=force when copying to NTFS
|
||||||
|
(when Windows compatibility is desired, anyway).
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR cp (1).
|
.BR cp (1).
|
||||||
.br
|
.br
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
gcp was written by Jérôme Poisson <goffi@goffi.org>.
|
gcp was written by Jérôme Poisson <goffi@goffi.org>.
|
||||||
|
It is currently maintained by Matteo Cypriani <mcy@lm7.fr>.
|
||||||
.PP
|
.PP
|
||||||
This manual page was written by Thomas Preud'homme <robotux@celest.fr>,
|
This manual page was initially written by Thomas Preud'homme
|
||||||
for the Debian project (and may be used by others).
|
<robotux@celest.fr> for the Debian project (and may be used by others).
|
||||||
|
|
177
gcp.po → gcp.pot
177
gcp.po → gcp.pot
|
@ -1,262 +1,265 @@
|
||||||
# SOME DESCRIPTIVE TITLE.
|
# gcp -- translation template
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
#
|
||||||
# This file is distributed under the same license as the PACKAGE package.
|
# This file is distributed under the same license as the gcp package.
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
||||||
#
|
#
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.2.0\n"
|
"Project-Id-Version: 0.2.0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2018-04-22 20:09+0200\n"
|
"POT-Creation-Date: 2018-10-14 20:51+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: English\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: gcp:45
|
#: gcp:46
|
||||||
msgid "Error during import"
|
msgid "Error during import"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:46
|
#: gcp:47
|
||||||
msgid "Please check dependecies:"
|
msgid "Please check dependecies:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:52
|
#: gcp:54
|
||||||
msgid "ProgressBar not available, please download it at https://pypi.org/"
|
msgid "ProgressBar not available, please download it at https://pypi.org/"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:3
|
#: gcp:55
|
||||||
msgid ""
|
msgid ""
|
||||||
"Progress bar deactivated\n"
|
"Progress bar deactivated\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:88
|
#: gcp:90
|
||||||
msgid "Init DbusObject..."
|
msgid "Init DbusObject..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:109
|
#: gcp:111
|
||||||
msgid "INTERNAL ERROR: invalid arguments"
|
msgid "INTERNAL ERROR: invalid arguments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:114
|
#: gcp:116
|
||||||
msgid "INTERNAL ERROR: invalid source_dir"
|
msgid "INTERNAL ERROR: invalid source_dir"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:169
|
#: gcp:171
|
||||||
msgid "/!\\ THE FOLLOWING FILES WERE *NOT* SUCCESSFULY COPIED:"
|
msgid "/!\\ THE FOLLOWING FILES WERE *NOT* SUCCESSFULY COPIED:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:175
|
#: gcp:177
|
||||||
msgid "The following files were copied, but some errors happened:"
|
msgid "The following files were copied, but some errors happened:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:181
|
#: gcp:183
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Please check journal: %s"
|
msgid "Please check journal: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:203
|
#: gcp:205
|
||||||
msgid "gcp launched"
|
msgid "gcp launched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:211
|
#: gcp:213
|
||||||
msgid "Init DBus..."
|
msgid "Init DBus..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:241
|
#: gcp:244
|
||||||
msgid "Can't read mounts table"
|
msgid "Can't read mounts table"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:248
|
#: gcp:251
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Adding to copy list: %(path)s ==> %(dest_path)s (%(fs_type)s)"
|
msgid "Adding to copy list: %(path)s ==> %(dest_path)s (%(fs_type)s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:253
|
#: gcp:258
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Can't copy %(path)s: %(exception)s"
|
msgid "Can't copy %(path)s: %(exception)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:280
|
#: gcp:286
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Can't append %(path)s to copy list: %(exception)s"
|
msgid "Can't append %(path)s to copy list: %(exception)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:283
|
#: gcp:289
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Can't access %(dirpath)s: %(exception)s"
|
msgid "Can't access %(dirpath)s: %(exception)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:295
|
#: gcp:301
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Invalid dest_path: %s"
|
msgid "Invalid dest_path: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:300
|
#: gcp:306
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "The path given in arg doesn't exist or is not accessible: %s"
|
msgid "The path given in arg doesn't exist or is not accessible: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:304
|
#: gcp:310
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "omitting directory \"%s\""
|
msgid "omitting directory \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:329
|
#: gcp:348
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File [%s] already exists, skipping it!"
|
msgid "File [%s] already exists, skipping it!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:347
|
#: gcp:368
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "COPYING %(source)s ==> %(dest)s"
|
msgid "COPYING %(source)s ==> %(dest)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:447
|
#: gcp:462
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f PiB"
|
msgid "%.2f PiB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:449
|
#: gcp:464
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f TiB"
|
msgid "%.2f TiB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:451
|
#: gcp:466
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f GiB"
|
msgid "%.2f GiB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:453
|
#: gcp:468
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f MiB"
|
msgid "%.2f MiB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:455
|
#: gcp:470
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%.2f KiB"
|
msgid "%.2f KiB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:457
|
#: gcp:471
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%i B"
|
msgid "%i B"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:465 gcp:470
|
#: gcp:479 gcp:485
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Copying %s"
|
msgid "Copying %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:497 gcp:530
|
#: gcp:515 gcp:548
|
||||||
msgid ""
|
msgid ""
|
||||||
"No saved sources with this name, check existing names with --sources-list"
|
"No saved sources with this name, check existing names with --sources-list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:507
|
#: gcp:525
|
||||||
msgid "Saved sources:"
|
msgid "Saved sources:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:521
|
#: gcp:539
|
||||||
msgid ""
|
msgid ""
|
||||||
"There is already a saved sources with this name, skipping --sources-save"
|
"There is already a saved sources with this name, skipping --sources-save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:557
|
#: gcp:578
|
||||||
msgid "copy directories recursively"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:561
|
|
||||||
msgid "force overwriting of existing files"
|
msgid "force overwriting of existing files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:565
|
#: gcp:582
|
||||||
|
msgid "always follow symbolic links in sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:586
|
||||||
|
msgid "never follow symbolic links in sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:590
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "same as --preserve=%s"
|
msgid "same as --preserve=%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:569
|
#: gcp:594
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"preserve specified attributes; accepted values: 'all', or one or more "
|
"preserve specified attributes; accepted values: 'all', or "
|
||||||
"amongst %s"
|
"one or more amongst %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:574
|
#: gcp:599
|
||||||
msgid "always follow symbolic links in sources"
|
msgid "copy directories recursively"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:578
|
#: gcp:603
|
||||||
msgid "never follow symbolic links in sources"
|
msgid "display what is being done"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:586
|
#: gcp:614
|
||||||
msgid "fix filesystem name incompatibily (default: auto)"
|
msgid ""
|
||||||
msgstr ""
|
"fix file names incompatible with the destination file "
|
||||||
|
"system (default: auto)"
|
||||||
#: gcp:590
|
|
||||||
msgid "same as --fs-fix=no (overrides --fs-fix)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:594
|
|
||||||
msgid "disable progress bar"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:598
|
|
||||||
msgid "Show what is currently done"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:607
|
|
||||||
msgid "Save source arguments"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:611
|
|
||||||
msgid "Save source arguments and replace memory if it already exists"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: gcp:615
|
|
||||||
msgid "Load source arguments"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:619
|
#: gcp:619
|
||||||
msgid "delete saved sources"
|
msgid ""
|
||||||
|
"[DEPRECATED] same as --fix-filename=no (overrides --fix-"
|
||||||
|
"filenames)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:623
|
#: gcp:624
|
||||||
msgid "List names of saved sources"
|
msgid "disable progress bar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:627
|
#: gcp:631
|
||||||
msgid "List names of saved sources and files in it"
|
msgid "save sources arguments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:635
|
||||||
|
msgid "save sources arguments and replace memory if it already exists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:639
|
#: gcp:639
|
||||||
msgid "Progress bar is not available, deactivating"
|
msgid "load sources arguments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:643
|
||||||
|
msgid "delete saved sources list"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:647
|
||||||
|
msgid "list names of saved sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:651
|
||||||
|
msgid "list names of saved sources and files in it"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:663
|
#: gcp:663
|
||||||
|
msgid "Progress bar is not available, deactivating"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: gcp:687
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Invalid --preserve value '%s'"
|
msgid "Invalid --preserve value '%s'"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:690
|
#: gcp:714
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "There is already one instance of %s running, pluging to it"
|
msgid "There is already one instance of %s running, pluging to it"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:696
|
#: gcp:720
|
||||||
msgid "Wrong number of arguments"
|
msgid "Wrong number of arguments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:698
|
#: gcp:722
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "adding args to gcp: %s"
|
msgid "adding args to gcp: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: gcp:707
|
#: gcp:731
|
||||||
msgid "User interruption: good bye"
|
msgid "User interruption: good bye"
|
||||||
msgstr ""
|
msgstr ""
|
Binary file not shown.
4
setup.py
4
setup.py
|
@ -41,9 +41,9 @@ setuptools.setup(
|
||||||
# 'console_scripts': ['gcp=gcp:main'],
|
# 'console_scripts': ['gcp=gcp:main'],
|
||||||
# },
|
# },
|
||||||
data_files=[
|
data_files=[
|
||||||
|
('man/man1', ["gcp.1"]),
|
||||||
('share/locale/fr/LC_MESSAGES', ['i18n/fr/LC_MESSAGES/gcp.mo']),
|
('share/locale/fr/LC_MESSAGES', ['i18n/fr/LC_MESSAGES/gcp.mo']),
|
||||||
('share/man/man1', ["gcp.1"]),
|
('share/doc/%s' % name, ['CHANGELOG', 'LICENSE', 'README.md']),
|
||||||
('share/doc/%s' % name, ['CHANGELOG', 'LICENSE.txt', 'README.md']),
|
|
||||||
],
|
],
|
||||||
install_requires=['PyGObject', 'dbus-python'],
|
install_requires=['PyGObject', 'dbus-python'],
|
||||||
python_requires='>=3',
|
python_requires='>=3',
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
"""
|
"""
|
||||||
gcp: Goffi's CoPier -- unit tests
|
gcp: Gcp CoPier -- unit tests
|
||||||
Copyright (c) 2010, 2011 Jérôme Poisson <goffi@goffi.org>
|
Copyright (c) 2010, 2011 Jérôme Poisson <goffi@goffi.org>
|
||||||
Copyright (c) 2018 Matteo Cypriani <mcy@lm7.fr>
|
Copyright (c) 2018 Matteo Cypriani <mcy@lm7.fr>
|
||||||
|
|
||||||
|
@ -239,6 +239,19 @@ class TestCopyCases(unittest.TestCase):
|
||||||
check_after = dirCheck('.')
|
check_after = dirCheck('.')
|
||||||
self.assertEqual(check_before, check_after)
|
self.assertEqual(check_before, check_after)
|
||||||
|
|
||||||
|
def test_fix_filenames(self):
|
||||||
|
"""Checks the --fix-filenames option.
|
||||||
|
"""
|
||||||
|
source = 'wi||fat<like>this:"file*name"?'
|
||||||
|
fixed_name = 'wi!!fat[like]this;\'file+name\'_'
|
||||||
|
makeRandomFile(source, S10K)
|
||||||
|
source_sha = sha1sum(source)
|
||||||
|
mkdir('dest_dir')
|
||||||
|
ret = system(GCP + " --fix-filenames=force '" + source + "' dest_dir")
|
||||||
|
self.assertNotEqual(ret, 0)
|
||||||
|
dest = join('dest_dir', fixed_name)
|
||||||
|
dest_sha = sha1sum(dest)
|
||||||
|
self.assertEqual(source_sha, dest_sha)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue