Permuter les noms de fichiers et de répertoires

2

J'ai une collection de fichiers à ./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 nom de fichier est le chemin. Y at-il un bon moyen de le faire? Il y a ~ 1000 fichiers au total avec ~ 100 noms de fichiers distincts.

    
posée Charles 28.02.2018 - 04:23
la source

3 réponses

4

Quelque chose comme ça devrait fonctionner (notez que j'ai echo les commandes réelles, veuillez vérifier avec soin que cela fait le bon choix 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
    
réponse donnée steeldriver 28.02.2018 - 05:07
la source
2

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 }'
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 décrite lorsqu’ils sont exécutés dans . . Veuillez le vérifier avant utilisation.

#!/bin/bash

for i in ./*/fixed/path/*; do
    date_and_time=$(echo "$i" |awk -F "/" '{print }');
    filename=$(basename "$i");
    mkdir "$filename";
    mv "$i" "$filename"/"$date_and_time";
done;
    
réponse donnée dsstorefile1 28.02.2018 - 05:04
la source
0

Comme ça:

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

Modifier :

Si vous avez besoin de créer plus de dossiers, je vous recommande de créer un script comme celui-ci:

Avant de commencer, je vous recommande de faire une sauvegarde du dossier sur lequel vous essayez de le faire.

cd dans le dossier sur lequel vous essayez d’opérer, puis:

for file in *; do
  if [[ -f "$file" ]]; then
    mkdir "${file%.*}"
    mv "$file" "${file%.*}"
  fi
done
  1. Bouclez tous les fichiers (*) du dossier en cours.
  2. créer un dossier (mkdir) à partir du fichier sans son extension $ {file%. *}
  3. déplace (mv) le fichier dans ce dossier.
réponse donnée An0n 28.02.2018 - 04:38
la source

Lire d'autres questions sur les étiquettes