2010-01-07 7 views
1

Je veux copier les fichiers trouvés par find (avec l'option exec cp) mais, je voudrais changer le nom de ces fichiers - par exemple find ... -exec cp '{}' test_path/"test_"'{}', qui à mon test_path devrait copier tous les fichiers trouvés par find mais avec préfixe 'test'. mais ce n'est pas du travail.en utilisant find avec exec

Je serais heureux si quelqu'un pouvait me donner quelques idées sur la façon de le faire.

meilleures salutations

+0

AHHAHAH wow Je pense que nous tous qui answreed celui-ci doit obtenir un badge comme "la plupart des gens avec une réponse simulaire à la même question en même temps" – RandomNickName42

+0

et par simulaire je surtout signifie simplement que nous avons tous utilisé une boucle for et géré l'opération avec une variable temp – RandomNickName42

+0

-exec n'est pas ce que vous voulez utiliser ici . Le but de "-exec" est d'exécuter une commande sur chaque fichier pour déterminer s'il doit être inclus dans la liste des résultats de find, c'est pourquoi grep est l'exemple le plus courant pour cette utilisation. – alxp

Répondre

0

Vous devriez mettre l'ensemble test_path/"test_"'{}' dans "" Comme:

find ... -exec cp "{}" "test_path/test_{}" \;

+0

Cela ne fonctionne pas réellement car {} prend la totalité de la recherche comme résultat, donc vous obtiendrez test_path/test_yourfolder/file.txt de /yourfolder/file.txt – Calmar

+0

Mais si {} est un chemin complet (comme c'est souvent le cas avec ' find') will "test_path/test_ {}" signifie ce que vous voulez? – pavium

+0

J'ai supposé que OP voulait copier chaque fichier dans un répertoire test_path où le fichier a été trouvé. Donc je suis allé dans cette ligne de pensée. – CodeRain

1

si vous avez Bash 4.0 et en supposant que vous trouverez txt fichiers

cd /path 
for file in ./**/*.txt 
do 
    echo cp "$file" "/test_path/test${file}" 
done 

de avec GNU find

find /path -type f -iname "*.txt" | while read -r -d"" FILE 
do 
    cp "$FILE" "test_${FILE}" 
done 

ou d'une autre version de GNU + bash trouver

find /path -type f -name "*txt" -printf "cp '%p' '/tmp/test_%f'\n" | bash 

OU celui-ci laid si vous n'avez pas GNU find

$ find /path -name '*.txt' -type f -exec basename {} \; | xargs -I file echo cp /path/file /destination/test_file 
+0

des idées comment l'utiliser sans ouvrir le chemin? – JosiP

+0

voir la troisième version – ghostdog74

+0

@ ghostdog74: vous avez oublié le "/ test" dans la première version de recherche. –

1
for i in `find . -name "FILES.EXT"`; do cp $i test_path/test_`basename $i`; done 

On suppose que vous êtes le répertoire qui a les fichiers à copier et test_path est un sous-répertoire de celui-ci.

0

Je voudrais le casser un peu, comme ceci;

for line in `find /tmp -type f`; do FULL=$line; name=`echo $line|rev|cut -d/-f -1|rev` ; echo cp $FULL "new/location/test_$name" ;done 

Voici la sortie;

cp /tmp/gcc.version new/location/test_gcc.version 
cp /tmp/gcc.version2 new/location/test_gcc.version2 

enlever naturellement l'écho de la dernière partie, il est donc pas seulement ce qu'il echo'ng conseillerai de fait et courir cp

+0

hoho! mais je vote pour ma solution simulaire comme la plus flexible, ne nécessite pas de dir courant et peut cp dans un dossier de destination arbitraire profond/complexe !!;) Cependant, il peut être le plus lent, peut-être pas si vous avez beaucoup de tho !! – RandomNickName42