J'ai plusieurs fichiers .pdb dans différents dossiers. Comment boucler via tout le répertoire nommer tous les fichiers à un nom particulier test.pdb?
Structure de l'échantillon p> Structure de sortie souhaitée p> for d in */ ; do
mv *.pdb test.pdb
done
3 Réponses :
Vous devez inclure le nom du répertoire. Juste *. PDB code> se développera toujours aux fichiers correspondant au Wildcard dans le répertoire actuel.
for d in ./*/ ; do
mv "$d/"*.pdb "$d/"test.pdb
done
Essayez ceci
Cela pourrait fonctionner pour le cas exact décrit, mais se brisera dès qu'il y a plus d'un fichier .pdb code> dans un répertoire, et pour tout répertoire contenant des espaces blancs ou des métacaraceurs de shell (en raison d'une expansion non cotée).
solution alternative, itération des fichiers PDF, au lieu des noms de dossiers.
Ce n'est pas clair si un autre fichier PDB, dont le nom ne correspond pas au nom du dossier doit également être affecté. Le test de code pour cette condition. Il peut être supprimé si non nécessaire. P>
for file in */*.pdb ; do d=$(dirname $file) b=$(basename $file .pdb) [ "$d" = "$b" ] && mv "$d/$b.pdb" "$d/test.pdb" done
Dans votre boucle, vous effectuez toujours la commande identique dans le répertoire à partir de laquelle vous exécutez la boucle. Vous n'accédez jamais à un fichier PDB dans un sous-répertoire. De plus,
mv * .pdb quelque chose code> renommerait un fichier uniquement s'il n'ya qu'un seul fichier PDB correspondant au motif. S'il y en a plus d'un, quelque chose doit être un répertoire et les fichiers sont déplacés dans ce répertoire.