J'ai une collection de fichiers sur ./date-and-time/fixed/path/filename
où date-and-time
et filename
sont variables. Je voudrais déplacer tous ces fichiers vers ./filename/date-and-time
. L'ancien chemin est le nom de fichier et l'ancien est le chemin. Y at-il un bon moyen de le faire? Il y a environ 1 000 fichiers avec environ 100 noms de fichiers distincts.
Quelque chose comme ceci devrait fonctionner (remarque, j'ai echo
ed les commandes réelles; veuillez vérifier avec soin qu'il fait la bonne chose avant de les supprimer)
#!/bin/bash
shopt -s nullglob
for file in */fixed/path/*; do
[[ -f "$file" ]] || continue
f="${file##*/}"; d="${file%%/*}"
echo mkdir -p "$f" && echo mv --no-clobber -- "$file" "$f/$d"
done
Je suppose que le motif du chemin est toujours ./date-and-time/fixed/path/filename
avec les variables date-and-time
et filename
.
date-and-time
peut être extrait via awk
:
$ echo './date-and-time/fixed/path/filename' |awk -F "/" '{print $2}'
date-and-time
filename
est un peu plus facile à obtenir car il peut être extrait par basename
:
$ basename ./date-and-time/fixed/path/filename
filename
À partir de ces deux segments de code, un script non testé suit pour déplacer les fichiers de la manière que vous décrivez lorsqu'il est exécuté dans .
. Veuillez le vérifier avant utilisation.
#!/bin/bash
for i in ./*/fixed/path/*; do
date_and_time=$(echo "$i" |awk -F "/" '{print $2}');
filename=$(basename "$i");
mkdir "$filename";
mv "$i" "$filename"/"$date_and_time";
done;
Comme ça :
mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time
Si vous avez besoin de créer plus de dossiers, je vous recommande de créer un script ressemblant à ceci:
Avant de commencer, je vous recommande vraiment de faire une sauvegarde du dossier sur lequel vous essayez de le faire.
cd dans le dossier que vous essayez d’opérer, puis:
for file in *; do
if [[ -f "$file" ]]; then
mkdir "${file%.*}"
mv "$file" "${file%.*}"
fi
done