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.
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
3 Réponses :
ls -lt | sort
Le paramètre -t
triera par date et heure, et le tri doit trier par type de fichier.
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.
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
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;
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.
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?