J'ai un dossier nommé /home/user/temps
qui contient 487 dossiers. Dans chaque dossier, j'ai un fichier appelé thumb.png.
Je veux copier tous les fichiers nommés thumb.png dans un dossier séparé et les renommer en fonction du dossier dont ils sont issus.
Réponses:
Voici:
Éditer:
la sagesse canonique, soit dit en passant, est que l'utiliser
find
pour cela est une mauvaise idée - simplement utiliser l'expansion du shell est beaucoup plus fiable. En outre, cela supposebash
, mais je suppose que c'est une hypothèse sûre :)modifier 2:
pour plus de clarté, je vais le décomposer:
les détails sur la
${var/Pattern/Replacement}
construction peuvent être trouvés ici .les guillemets dans la
cp
ligne sont importants pour gérer les espaces et les sauts de ligne, etc. dans les noms de fichiers.la source
new_file/\/thumb
?${VARIABLE/PATTTERN/REPLACEMENT}
produit la valeur deVARIABLE
mais avec le motif remplacé par le texte de remplacement. Ici, le modèle est/thumb
(le/
besoin doit être échappé pour qu'il ne ressemble pas${new_file//PATTERN/REPLACEMENT}
, ce qui en fait un remplacement global au lieu d'un remplacement de première occurrence) et le texte de remplacement est vide./home/user/temps
, ce qui n'est pas clair à la question. Si ce n'est pas le cas, vous devez trouver ou**
.Cela fonctionne pour des sous-répertoires arbitrairement profonds:
La partie intéressante est l' expansion des paramètres
${NAME//\//_}
. Il prend le contenu deNAME
et remplace chaque occurrence de/
with_
.Remarque: le résultat dépend du répertoire de travail et du paramètre de chemin d'accès pour rechercher. J'ai exécuté la commande depuis le répertoire parent de temps. Remplacez
cp
parecho
pour expérimenter.la source
Code d'assistance court:
appelons-le «deslash.sh» et rendons-le exécutable. Appelez-le avec:
Il échouera en cas de collision
mais c'est inévitable.
la source
Essaye ça
Éditer
J'ai ajouté des citations au cas où l'un de vos noms de répertoire aurait des caractères d'espace blanc intégrés.
Aussi je l' ai changé cette façon il n'imprimer les commandes à exécuter. Examinez la sortie du script pour vous assurer que tous les fichiers / noms de chemin semblent corrects. Lorsque vous êtes sûr qu'il n'y a aucun problème avec les commandes qui seront exécutées, supprimez le .
echo
la source
mv -i ./A A/thumb.png ../tmp/.png
- tous les fichiers se terminent par ../tmp/.png (../tmp est mon répertoire cible).find -type d
et voir la sortie. Cela obtient-il tous les répertoires que vous attendez? Si tel n'est pas le cas, veuillez ajouter une sortie pour montrer le problème. Bonne chance.read dir
effectue le fractionnement de mots et prend, à partir d'un répertoirea\nb
a et b, deux instances, qu'aucun masquage ne peut résoudre.Pour copier, vous avez besoin de la commande cp et renommer pour linux revient à déplacer le fichier, vous devez donc le faire avec la commande mv . Sous Linux, vous devez toujours spécifier le chemin complet, depuis la source, si vous êtes dans un autre dossier, et jusqu'au dossier de destination, bien sûr. Je serais quelque chose comme ça, pour copie:
ou pour renommer ou déplacer
la source
find