web-dev-qa-db-fra.com

Rechercher et copier des fichiers

Pourquoi ce qui suit ne copie-t-il pas les fichiers dans le dossier de destination?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
114
shantanuo

Si votre intention est de copier les fichiers trouvés dans/home/shantanu/tosend, l'ordre des arguments de cp est inversé:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp {} /home/shantanu/tosend  \;

Remarque: la commande find utilise {} en tant qu'espace réservé pour le fichier correspondant.

253
malcolmpdx

j'ai fait face à un problème quelque chose comme ça ...

En fait, vous pouvez traiter de deux manières _ la sortie de la commande find dans la commande copy

  1. Si la sortie de la commande find ne contient aucun espace, c'est-à-dire si le nom du fichier ne contient pas d'espace, vous pouvez utiliser la commande ci-dessous:

    Syntaxe: find <Path> <Conditions> | xargs cp -t <copy file path>

    Exemple: find -mtime -1 -type f | xargs cp -t inner/

  2. Mais la plupart du temps, nos fichiers de données de production peuvent contenir de l’espace. Donc, la plupart du temps, la commande mentionnée ci-dessous est plus sûre:

    Syntaxe: find <path> <condition> -exec cp '{}' <copy path> \;

    Exemple find -mtime -1 -type f -exec cp '{}' inner/ \;

Dans le deuxième exemple, la dernière partie, le point-virgule, est également considérée comme faisant partie de la commande find, à échapper avant d'appuyer sur le bouton d'entrée. Sinon, vous obtiendrez une erreur quelque chose comme ça

find: missing argument to `-exec'

Dans votre cas, la syntaxe de commande de copie est fausse afin de copier le fichier trouvé dans /home/shantanu/tosend. La commande suivante fonctionnera:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
29
Thiyagu ATR

Vous devez utiliser cp -t /home/shantanu/tosend pour lui dire que l'argument est le répertoire cible et non une source. Vous pouvez alors le changer en -exec ... + afin de permettre à cp de copier autant de fichiers que possible à la fois.