Sous unix, je souhaite copier tous les fichiers avec une certaine extension (tous les fichiers Excel) de tous les sous-répertoires vers un autre répertoire. J'ai la commande suivante:
cp --parents `find -name \*.xls*` /target_directory/
Les problèmes avec cette commande sont:
Il copie également la structure des répertoires, et je ne veux que les fichiers (donc tous les fichiers doivent se retrouver dans / target_directory /)
Il ne copie pas les fichiers avec des espaces dans les noms de fichiers (qui sont assez nombreux)
Des solutions à ces problèmes?
find... exec mv
?Réponses:
--parents
copie la structure des répertoires, vous devriez donc vous en débarrasser.La façon dont vous avez écrit ceci, les
find
exécutions et la sortie sont placées sur la ligne de commande de telle sorte quecp
vous ne pouvez pas faire la distinction entre les espaces séparant les noms de fichiers et les espaces dans le nom de fichier. Il vaut mieux faire quelque chose commedans lequel
cp
est exécuté pour chaque nom de fichier quifind
trouve et transmis correctement le nom de fichier. Voici plus d'informations sur cette technique.Au lieu de tout ce qui précède, vous pouvez utiliser zsh et taper simplement
zsh
peut étendre les jokers pour inclure des sous-répertoires et rend ce genre de chose très facile.la source
Bash
4.0+ etksh93
prend également en charge**
. Pour bash, utilisezshopt -s globstar
pour l'activer. Pour ksh, c'estset -G
ouset -o globstar
.find . -name '*.xls' -print0 | xargs -0 cp -t destdir
De tout ce qui précède, j'ai trouvé cette version. Cette version fonctionne également pour moi dans le terminal de récupération mac.
Il cherchera dans le répertoire courant et de manière récursive dans tous les sous-répertoires les fichiers avec l'extension xsl. Il les copiera tous dans le répertoire cible.
Les indicateurs cp sont:
la source
J'avais un problème similaire. Je l'ai résolu en utilisant:
Le
'{}'
et";"
exécute la copie sur chaque fichier.la source
Je devais aussi le faire moi-même. Je l'ai fait via l'argument --parents pour cp:
la source
vous pouvez supprimer les --parents mais il y a un risque de collision si plusieurs fichiers portent le même nom.
la source