Salut tout le monde,
J’ai besoin d’aide sur un script .sh que j’ai créé avec l’aide de ChatGPT pour déplacer des fichiers MP4 d’un dossier source à un dossier destination, en fonction de la date et de l’heure des fichiers. Le script fonctionne bien pour l’instant, mais je souhaite ajouter une règle supplémentaire, et c’est là que je galère vraiment.
Contexte :
• Mes fichiers MP4 ont une date et une heure dans leur nom. « 25-10-2024 15-05-29.mp4 »
• Mes dossiers de destination sont nommés avec une date spécifique. « [14] Ven-25-10-2024 » (14 étant le numéro du dossier)
• Mon script actuel déplace les fichiers dans le dossier correspondant à leur date, puis renomme les fichiers en retirant l’heure et en ajoutant un numéro entre crochets, qui s’incrémente au fur et à mesure (ex. [1], [2], etc.). Si un fichier est déjà dans le dossier avec [1], le prochain sera renommé en [2], etc.
• Le script s’exécute toutes les minutes et marche très bien pour ça.
La complexité supplémentaire :
Je veux que tous les fichiers créés entre minuit et cinq heures du matin soient considérés comme appartenant à la veille. Par exemple, si on est le 2 janvier entre minuit et cinq heures, je voudrais que ces fichiers soient déplacés dans le dossier du 1er janvier. De même, l’incrémentation des numéros entre crochets doit continuer de manière cohérente avec les fichiers déjà présents dans ce dossier.
Ce que j’ai tenté :
ChatGPT m’a aidé pour une bonne partie, mais pour cette logique de bascule de date entre minuit et cinq heures, ça coince. J’ai passé des nuits dessus, mais rien n’y fait : ça bugge ou ça ne fonctionne pas comme je veux.
Si quelqu’un a une idée pour intégrer cette logique dans le script, ça me sauverait. Je vous poste le code que j’ai pour le moment, en espérant que quelqu’un puisse m’aiguiller sur cette partie.
Merci d’avance !
J’ai besoin d’aide sur un script .sh que j’ai créé avec l’aide de ChatGPT pour déplacer des fichiers MP4 d’un dossier source à un dossier destination, en fonction de la date et de l’heure des fichiers. Le script fonctionne bien pour l’instant, mais je souhaite ajouter une règle supplémentaire, et c’est là que je galère vraiment.
Contexte :
• Mes fichiers MP4 ont une date et une heure dans leur nom. « 25-10-2024 15-05-29.mp4 »
• Mes dossiers de destination sont nommés avec une date spécifique. « [14] Ven-25-10-2024 » (14 étant le numéro du dossier)
• Mon script actuel déplace les fichiers dans le dossier correspondant à leur date, puis renomme les fichiers en retirant l’heure et en ajoutant un numéro entre crochets, qui s’incrémente au fur et à mesure (ex. [1], [2], etc.). Si un fichier est déjà dans le dossier avec [1], le prochain sera renommé en [2], etc.
• Le script s’exécute toutes les minutes et marche très bien pour ça.
La complexité supplémentaire :
Je veux que tous les fichiers créés entre minuit et cinq heures du matin soient considérés comme appartenant à la veille. Par exemple, si on est le 2 janvier entre minuit et cinq heures, je voudrais que ces fichiers soient déplacés dans le dossier du 1er janvier. De même, l’incrémentation des numéros entre crochets doit continuer de manière cohérente avec les fichiers déjà présents dans ce dossier.
Ce que j’ai tenté :
ChatGPT m’a aidé pour une bonne partie, mais pour cette logique de bascule de date entre minuit et cinq heures, ça coince. J’ai passé des nuits dessus, mais rien n’y fait : ça bugge ou ça ne fonctionne pas comme je veux.
Si quelqu’un a une idée pour intégrer cette logique dans le script, ça me sauverait. Je vous poste le code que j’ai pour le moment, en espérant que quelqu’un puisse m’aiguiller sur cette partie.
Merci d’avance !
Bash:
#!/bin/bash
# Chemins des dossiers où sont enregistrées les vidéos
source_folders=(
"/Users/gregoryen/Scripts/TEST/SOURCE"
)
# Dossier de base à partir duquel tu veux rechercher les sous-dossiers
base_folder="/Users/gregoryen/Scripts/TEST/DESTINATION"
# Taille minimale autorisée en Mo
min_size_mb=10
# Fonction pour générer le nouveau nom du fichier
generate_new_filename() {
local date_part="$1"
local destination_folder="$2"
local counter=1
local new_filename=""
while true; do
new_filename="${date_part}-[${counter}].mp4"
if [ ! -e "${destination_folder}/${new_filename}" ]; then
break
fi
((counter++))
done
echo "$new_filename"
}
# Fonction pour vérifier si le fichier est en cours de création
is_file_still_writing() {
local file="$1"
local initial_size=$(du -m "$file" | cut -f1)
sleep 5 # Attendre 5 secondes
local new_size=$(du -m "$file" | cut -f1)
# Vérifie si la taille a changé
if [ "$initial_size" -ne "$new_size" ]; then
return 0 # Le fichier est encore en cours d'écriture
else
return 1 # Le fichier est prêt à être déplacé
fi
}
# Parcours des dossiers sources
for source_folder in "${source_folders[@]}"; do
# Vérifier si des fichiers MP4 existent dans le dossier source
if [ -n "$(ls -A "$source_folder"/*.mp4 2>/dev/null)" ]; then
# Parcours des fichiers MP4 dans le dossier source
for video_file in "$source_folder"/*.mp4; do
# Vérifier la taille du fichier
file_size=$(du -m "$video_file" | cut -f1)
# Vérifier si le nom du fichier contient "Replay"
if [[ "$video_file" == *"Replay"* ]]; then
echo "Le fichier $video_file contient 'Replay' et sera ignoré."
continue
fi
if [ "$file_size" -ge "$min_size_mb" ]; then
# Extraire la date du nom du fichier
file_name=$(basename "$video_file")
date_part=$(echo "$file_name" | grep -oE '[0-9]{2}-[0-9]{2}-[0-9]{4}' | head -n1)
if [ -n "$date_part" ]; then
# Recherche du dossier correspondant dans la structure à partir du dossier de base
destination_subfolder=$(find "$base_folder" -type d -name "*$date_part*" | head -n 1)
if [ -n "$destination_subfolder" ]; then
# Chemin du sous-dossier « Découpage par tranche de 2 heures »
final_destination="${destination_subfolder}/Découpage par tranche de 2 heures"
# Créer le sous-dossier s'il n'existe pas
if [ ! -d "$final_destination" ]; then
mkdir -p "$final_destination"
echo "Sous-dossier créé : $final_destination"
fi
# Attendre 30 secondes avant de vérifier le fichier
echo "Attente de 30 secondes avant de vérifier $video_file."
sleep 30
# Vérifier si le fichier est encore en cours d'écriture
if is_file_still_writing "$video_file"; then
echo "Le fichier $video_file est encore en cours de création, il ne sera pas déplacé."
continue
fi
# Vérifier à nouveau la taille du fichier avant de le déplacer
file_size=$(du -m "$video_file" | cut -f1)
if [ "$file_size" -ge "$min_size_mb" ]; then
# Générer le nouveau nom du fichier
new_filename=$(generate_new_filename "$date_part" "$final_destination")
# Déplacer le fichier MP4 avec le nouveau nom dans le sous-dossier
mv "$video_file" "${final_destination}/${new_filename}"
echo "Le fichier $file_name a été déplacé vers ${final_destination}/${new_filename}."
else
echo "Le fichier $video_file est inférieur à ${min_size_mb} Mo après vérification et ne sera pas déplacé."
fi
else
echo "Aucun dossier correspondant à la date $date_part n'a été trouvé dans la structure de dossiers."
fi
else
echo "La date n'a pas pu être extraite du fichier $file_name."
fi
else
echo "Le fichier $video_file est inférieur à ${min_size_mb} Mo et ne sera pas déplacé."
fi
done
else
echo "Aucun fichier MP4 trouvé dans le dossier $source_folder."
fi
done