1
votes

Trier les fichiers dans un répertoire avant de les renommer

J'apprends Bash et je voudrais donc écrire un script avec des courses sur mes fichiers et les nommer après le répertoire actuel.

Par exemple, current_folder_1, current_folder_2, current_folder_3 ...

for f in $(ls -1 -t -r)

Un de mes deux problèmes est que je voudrais les trier par premier type, puis par date_modified avant d'exécuter la boucle for-each-loop.

entrez la description de l'image ici

Quelque chose comme

for f in * | sort -k "type" -k "date_modified"
[...]

J'apprécierais de l'aide.

EDIT1: Résolution du problème de tri par date avec

#!/bin/bash

# script to rename images, sorted by "type" and "date modified" and named by current folder

#get current folder which is also basename of files
basename=$(basename "$PWD");
echo "Current folder is: ${basename}";
echo '';

#set counter for iteration and variables
counter=1;
new_name="";
file_extension="";

#for each file in current folder
for f in *
do
  #catch file name
  echo "Current file is:           ${f}"
  #catch file extension
  file_extension="${f##*.}";
  echo "Current file extension is: ${file_extension}"
  #create new name
  new_name="${basename}_${counter}.${file_extension}"
  echo "New name is:               ${new_name}";


  #mv $f "${new_name}";
  echo "Counter is:                ${counter}"
  ((counter++));
done


4 commentaires

J'ai remarqué la question modifiée et je veux juste vérifier si je l'ai bien comprise. Ma réponse la classe-t-elle comme vous le souhaitez?


Merci pour votre aide, j'ai mis à jour la question et la réponse.


Changer la base fondamentale d'une question n'est pas vraiment sympa car cela invalide les réponses que vous avez déjà obtenues qui répondent en fait à la question telle qu'elle a été posée à l'origine. Si vous obtenez une réponse à votre question, il serait préférable de l'accepter et de poser une nouvelle question si vous décidez de modifier les exigences.


.... aussi, je ne vois pas le changement dans la question qui rend votre réponse valide?


3 Réponses :


0
votes

ls -lt | sort

Le paramètre -t triera par date et heure, et le tri doit trier par type de fichier.


2 commentaires

Merci beaucoup, "ls -1 -t -r" a servi l'heure et la date. Tapez bien que j'espérais que je pourrais juste différent entre Image et Vidéo, donc .jpg et .png sont traités de la même manière.


J'ai édité la question.



1
votes

Cela pourrait être un début. J'ai commenté dans le code où je pense que c'est nécessaire, mais veuillez demander si quelque chose n'est pas clair.

#!/bin/bash

#get current folder which is also basename of files
folder=$(basename "$PWD");
echo "Current folder is: ${folder}";
echo

#set counter for iteration
counter=1;

for f in *
do
    file_extension="${f##*.}";

    # replace all whitespaces with underscores
    sort_extension=${file_extension//[[:space:]]/_}

    # get modification time in seconds since epoch
    sort_modtime=$(stat --format=%Y "$f")

    # output fed to sort
    echo $sort_extension $sort_modtime "/$f/"

    # sort on extension first and modification time after
done | sort -k1 -k2n | while read -r dummy1 dummy2 file
do
    # remove the slashes we added above
    file=${file:1:-1}

    file_extension="${file##*.}";

    new_name="${folder}_${counter}.${file_extension}"

    echo "moving \"$file\" to \"$new_name\""
    #mv "$file" "$new_name"

    (( counter++ ))
done


0 commentaires

0
votes

J'ai décidé de faire une solution de contournement avec deux boucles, une pour les images et une pour la vidéo.

#used for regex
shopt -s extglob

#used to get blanks in filenames
SAVEIFS=$IFS;
IFS=$(echo -en "\n\b");
[...]

image_extensions="(*.JPG|*.jpg|*.PNG|*.png|*.JPEG|*.jpeg)"
video_extensions="(*.mp4|*.gif)"
[...]
for f in $(ls -1 -t -r *${media_file_extensions})
[...]
for f in $(ls -1 -t -r *${video_extensions})
[...]

#reverse IFS to default
IFS=$SAVEIFS;


5 commentaires

Cela ne répond pas à votre propre question. Même si c'est votre question, il s'agit d'un site de questions-réponses, donc quelqu'un qui lit votre question et cette réponse acceptée sera très confus.


Je comprends votre point de vue et je n'ai pas voulu invalider votre réponse. Désolé pour ça. Mais la solution de contournement avec deux boucles est une solution de contournement qui répond également au problème d'origine, non?


Aucun problème. Je n'avais pas eu mon café du matin quand j'ai écrit mon commentaire, alors excusez-vous d'être venu si fort. Si vous avez un code fonctionnel, vous devez le publier (et vous pourrez ensuite remettre la réponse Acceptée sur la vôtre). Pour le moment, le code ci-dessus ne fonctionne pas, n'est-ce pas?


Ne t'inquiète pas. Comme vous l'avez dit, il s'agit d'un site de questions-réponses et nous devrions essayer de le maintenir ainsi. J'ai oublié quelques lignes en haut qui font que cette approche fonctionne. Vous trouvez le script complet ici: stackoverflow.com/questions/64537789/...


Ah, oui, je peux voir que cela trierait .jpg et .png ensemble et .mp4 et .gif ensemble bien que je soupçonne que vous aurez des problèmes avec des fichiers avec des espaces et des répertoires.