2
votes

Copiez des fichiers spécifiques de sous-répertoires dans un répertoire

J'ai un répertoire:

❯ find ./images -name *150x150.jpg -exec cp {} ./another-directory \;

Je voudrais copier tous ces fichiers ( thumb-150x150.jpg ) dans un répertoire.

XXX

Mais bien sûr, chaque fichier sera écrasé par le suivant.

Alors, comment pourrais-je les copier soit dans:

1) 1.jpg , 2.jpg , 3.jpg ... etc

ou

2 ) utilisez l'ID de sous-répertoire (./images/ 2060511653921052666 .images / thumb-150x150.jpg) comme nom de fichier cible ( 2060511653921052666.jpg dans cet exemple)? p >


3 commentaires

chaque fichier aura évidemment besoin d'un nom nouveau / distinct; alors que la communauté SO peut proposer une longue liste de nouveaux noms / formats, le format du nouveau nom est finalement à vous de décider; comment comptez-vous référencer / utiliser ces fichiers à l'avenir? devrez-vous appliquer n'importe quel type de classement aux nouveaux noms de fichiers? avez-vous besoin d'une capacité à rechercher / lister les fichiers en fonction d'un modèle spécifique? le nouveau nom de fichier doit-il contenir des informations pour indiquer d'où il provient? le fichier doit-il être lié / référencé à un autre répertoire ou fichier?


Le nom de fichier doit être distinct - c'est tout. Je n'ai pas besoin de faire référence à un fichier particulier. J'ai juste besoin de tous en un seul endroit (dossier).


@gib: Pourquoi ne pas nommer simplement les fichiers, c'est-à-dire 2060511653921052666-thumb-150x150.jpg . Vous pouvez ensuite tous les mettre dans le même répertoire et toujours voir d'où ils viennent?


3 Réponses :


1
votes

Un simple script bash, utilisant $ RANDOM pour générer un nombre aléatoire pour chaque image copiée. Un nombre aléatoire est incorporé dans le nouveau nom de chaque fichier.

Notez que $ RANDOM génère un nombre aléatoire entre 1 et 32767. Ainsi, le même nombre aléatoire pourrait être produit plus d'une fois. Ce n'est probable que si vous aviez des dizaines de milliers d'images à copier.

Il est assez facile d'améliorer le caractère aléatoire de chaque nombre généré est nécessaire.

# !/bin/bash
cd images
for d in *
do
    [ -d $d ] && cd $d
    for image in *150x150.jpg
    do
        cp -pv $image /another-dir/thumb${RANDOM}.jpg
    done
    [ -d $d ] && cd ..
done

p>


0 commentaires

1
votes

vous pouvez utiliser la boucle:

i=1
find ./images -name *150x150.jpg | while read line; do
        cp $line /anotherdir/$i.jpg
        i=$[i+1]
done


1 commentaires

Remplacez i = $ [i + 1] par ((i ++)) .



1
votes

Si vous avez GNU parallèle, c'est possible:

find -iname "*.mp3" | parallel 'cp {} ~/tmp/{/.}_`stat -c%i {}`.mp3'

{/} .......... gets just the filename with no full path "basename"
{.} .......... removes extension

le stat -c% i {} obtient l'inode pour chaque fichier

J'ai testé la commande ci-dessous sur mon système:

find ./images -name *150x150.jpg | \
parallel 'mv {} ./another-directory/`stat -c%i {}`_{/}'

Avant d'exécuter la commande proprement dite, vous pouvez mettre une commande echo devant cp ou mv dans l'ordre pour tester votre commande.

source: https://stackoverflow.com/a/16074963/2571881


0 commentaires