Créer des fichiers vide avec un script bash

Bonjour,
je manque un peu d’expérience en script bash ce qui m’amène à vous poser la question.

Je possède un fichier texte à ce nom : liste_films_inverse.csv
voici un exemple de ce qu’il contient.

HOR/Frisson_4.avi
KID/Lion_King_The.avi
ACT/Matrix_The.avi

J’ai déjà des dossier de créer selon la catégorie
Les dossier crées sont dans /laboratoire10

Je cherche le code pour créer des fichier avec le nom des films : (Frisson_4.avi) et les trier automatiquement dans les dossiers de leur catégorie. Est-ce que quelqu’un peut m’aider?

Voici le script bash que j’ai fais jusqu’à présent:

#Inverser toutes les colonnes
cat liste_films.csv | inverse > liste_films_inverse.csv

#Remplacement et ajout
cd /laboratoire10
find /liste_films_inverse.csv -type f -print0 | xargs -0 sed -i 's/ //g’
find /liste_films_inverse.csv -type f -print0 | xargs -0 sed -i 's/-/
/g’
find /liste_films_inverse.csv -type f -print0 | xargs -0 sed -i 's/"//g’
find /liste_films_inverse.csv -type f -print0 | xargs -0 sed -i 's/:/_/g’
find /liste_films_inverse.csv -type f -print0 | xargs -0 sed -i ‘s/$/.avi/g’

#Créer les dossiers
cat liste_films_inverse.csv | cut -d’/’ -f1 | sort -n | uniq -c | xargs mkdir -pv ./

#Créer les fichiers

Je transfère ton fil vers la section “Programmation”, plus à même d’y trouver un echo.

pour créer un fichier vide : touch

Je sais que la commande touch crée un fichier vide. Mais le code que je cherche est celui qui prendra une ligne dans un texte et que ce texte pris deviendra le nom d’un fichier.

Bonjour,
quelquechose comme :#!/bin/sh while read line; do touch $line done < liste_films_inverse.csv ?

Bonjour,

On peut aussi le faire avec awk :

Plus simple :

(non je ne crois pas que c’est un uuoc)

uuoc = “Useless use of cat”

Le but premier de cat est de concatener des fichiers, c’est ça??

L’employer dans un autre but entre dans un uuoc?

Je me rends compte que je n’utilise cat seulement que pour afficher le contenu de fichier… :075

Ça n’est pas grâve hein ? C’est juste un amusement les UUOC.

less avec les bonnes options permet de remplacer de manière agréable cat (par exemple quand le fichier est court il l’écris simplement sur sa sortie standard avant de quitter, on peut faire des recherches dans le fichier affiché).

Mais tu peut aussi essayer most qui a l’aire pas mal non plus.

Bonjour,
effectivement, le cat n’est pas nécessaire :

touch $(<fichier)

suffit…

Merci tu viens de me faire découvrir quelque chose j’avais jamais pensé à utiliser la redirection de flux sans commande avant.

Bonjour,

Vous ne gérez pas les espaces dans les noms de fichier correctement. Mais bon apparemment tidoye met des underscore partout.

Pas faux :

t="$IFS" IFS=" " touch $(<fichier) IFS=$t

set – $(<fichier); for i; do :>$i; done

Non? :slightly_smiling:

autant faire :

while read; do :>"${REPLY}"; done < "${fichier}"

ce qui évitera de lire 1 fois le fichier puis de le parcourir avec le for alors qu’ainsi il est lu et traité en même temps…

ou encore :

xargs -I{} touch "{}" < ${fichier} (mais pas vraiment performant car touch sera exécuté autant de fois qu’il y a de ligne dans le fichier)

On va s’amuser tous ensemble :

Pas testé mais ça devrait marcher. C’est simple mais ça manque de performance comme pour xargs.

Et un dernier pour la route :

possible aussi en awk :

Tant qu’on y est … :005

Autant faire attention aux lignes du style :

azerty;" rm -rf / " azerty; rm -rf /

Donc personnellement, je ferais :

On peut optimiser, mais ce n’est pas très utile je pense :

{ printf 'touch '; sed -e 's/\\/\\\\/g' -e "s/'/\\\'/g" -e 's/"/\\"/g' -e 's/^/"/' -e 's/$/"/' fichier; } | tr '\n' ' ' | sh -


PS: MisterFreez, pour la solution avec awk, il faut rajouter une paire de guillemets comme j’ai fait dans le 6ème post