web-dev-qa-db-fra.com

Échange de noms de fichiers et de répertoires

J'ai une collection de fichiers sur ./date-and-time/fixed/path/filenamedate-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.

2
Charles

Quelque chose comme ceci devrait fonctionner (remarque, j'ai echoed 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
4
steeldriver

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;
2
dsstorefile1

Comme ça :

mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time

Edit:

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
  1. Boucle sur tous les fichiers (*) du dossier actuel.
  2. créer un dossier (mkdir) à partir du fichier sans son extension $ {file%. *}
  3. déplacez (mv) le fichier dans ce dossier.
0
An0n