Rechercher et copier des fichiers

128

Pourquoi les éléments suivants ne copient-ils 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'
shantanuo
la source

Réponses:

273

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

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

Remarque: utilisez la commande find {} comme espace réservé pour le fichier correspondant

malcolmpdx
la source
14
Quel est le but de \;?
Astrid
5
@Astrid check this
shellbye
find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;y a-t-il quelque chose qui ne va pas avec cette commande? ça ne marche pas
mrid
2
Ne fonctionne pas si les résultats ont un espace dans le chemin. Des suggestions à ce sujet?
TheJeff
1
Dans Ubuntu 18, les accolades doivent également être placées entre guillemets simples: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo le
32

J'ai rencontré un problème comme celui-ci ...

En fait, de deux manières, vous pouvez traiter la findsortie de copycommande dans la commande

  1. Si findla sortie de la commande ne contient aucun espace, c'est-à-dire si le nom du fichier ne contient pas d'espace, vous pouvez utiliser la commande mentionnée 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, c'est-à-dire le point-virgule, est également considérée comme faisant partie de la findcommande, qui doit être échappée avant d'appuyer sur le bouton Entrée. Sinon, vous obtiendrez une erreur comme celle-ci

find: missing argument to `-exec'

Dans votre cas, la syntaxe de la commande de copie est incorrecte pour copier le fichier de recherche dans /home/shantanu/tosend. La commande suivante fonctionnera:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
Thiyagu ATR
la source
3. Si vous avez GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Exemple:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight
7

Vous devez utiliser cp -t /home/shantanu/tosendpour lui indiquer que l'argument est le répertoire cible et non une source. Vous pouvez ensuite le changer -exec ... +pour pouvoir cpcopier autant de fichiers que possible à la fois.

Ignacio Vazquez-Abrams
la source
2
Sous Linux, il fallait spécifier le répertoire cible comme find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
suit
3
Cette réponse pourrait être améliorée et raccourcie si la commande complète était fournie comme dans la réponse du haut.
Brian
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Robert A
la source
-2

La raison de cette erreur est que vous essayez de copier un dossier qui nécessite l'option -r également pour cp Merci

Sebin John
la source
3
Salut, comme la question a déjà reçu une réponse (il y a quelque temps), ce n'est pas vraiment une réponse pertinente, cela devrait également être un commentaire (lorsque vous avez plus de représentants), à moins que vous ne souhaitiez développer et expliquer. Juste un avertissement :).
W1ll1amvl