J’ai un tas de fichiers générés par le système hérité et le besoin est de renommer les fichiers en description longue (ce que les utilisateurs professionnels peuvent comprendre).
Exemple de nom de fichier: bususrapp.O16200.L1686.1201201304590298
RptList: bususrapp Billing file for app user
Lorsque le système génère un fichier de fichier ‘bususrapp’, celui-ci sera traduit en ‘Fichier de facturation pour l’utilisateur de l’application’ et le résultat final doit correspondre à « Fichier de facturation pour l’application user.1201201304590298.txt ».
for i in `ls * `; do j=`grep $i /tmp/Rptlist | awk '{print $2 $3 $4 $5} ;'` mv $i $j; done
Le dernier qualificatif dans le fichier exemple est mon horodatage. Je dois couper / copier et append le nouveau nom de fichier de description longue. ” Fichier de facturation pour l’application user.1201201304590298.txt ”
Veuillez suggérer comment réaliser cela.
Je crois que ce qui suit fera ce que vous voulez.
for file in *; do # Drop everything up to the last . stamp=${fname##*.}; # Drop everything after the first period. name=${fname%%.*} # Find the matching line in RptList. line=$(grep "$name" RptList) # Drop the first (space separated) field. line=${line#* } outfile="$line.$stamp.txt" mv $file $outfile; done
Donnez votre fichier d’entrée, cet awk fera votre nom de fichier de sortie désiré:
echo "bususrapp.O16200.L1686.1201201304590298 RptList: bususrapp Billing file for app user" | awk -F"[.]| RptList| bususrapp " '{print $NF"." $4 ".txt"}' Billing file for app user.1201201304590298.txt
Utilisez FS
pour faire tout le travail difficile, puis imprimez les champs les champs dans l’ordre spécifié.
Voici une réponse plus complète:
# use find instead of ls, pointing to files only find /tmp/Rptlist -name "bususrapp*" -type f -print | awk -F/ ' { # rebuild the path which was split up by FS for(i=1;i
Juste un style différent. La réponse de @EtanReisner est plus propre. Comme je ne script pas en bash, c'est ce que j'aurais essayé.