web-dev-qa-db-fra.com

Un script shell pour copier des fichiers d’un emplacement à un autre et renommer ajouter la date du jour à chaque fichier

J'ai un dossier sur mon serveur qui contient des fichiers. Celles-ci sont automatisées, ce qui signifie que chaque jour, nous obtenons automatiquement de nouveaux fichiers qui écraseront les anciens .Voulez donc faire une sauvegarde de ces données. Comment puis-je copier tous ces fichiers dans un autre dossier en renommant les fichiers avec la date du jour lors de la copie.

ex: j'ai un dossier nommé folder1 qui contient 4 fichiers. Le chemin d'accès à ce dossier est home/webapps/project1/folder1.

  1. aaa.csv
  2. bbb.csv
  3. ccc.csv
  4. ddd.csv

maintenant, je veux copier ces quatre fichiers dans un dossier différent nommé folder2 . Le chemin d'accès à ce dossier est home/webapps/project1/folder2 . lors de la copie de ces fichiers, je souhaite renommer chaque fichier et ajouter le fichier courant. date au fichier . donc mes noms de fichiers dans folder2 devraient être ..

  1. aaa091012.csv
  2. bbb091012.csv
  3. ccc091012.csv
  4. ddd091012.csv

Je veux écrire un script Shell pour cela. S'il vous plaît, donnez-moi une idée ou des exemples de scripts liés à cela.

18
ran

Dans bash, à condition que vos noms de fichiers n'aient pas d'espaces:

cd /home/webapps/project1/folder1
for f in *.csv
do 
   cp -v "$f" /home/webapps/project1/folder2/"${f%.csv}"$(date +%m%d%y).csv
done
27
Stephane Rouberol

Vous pouvez utiliser un script comme ci-dessous. Il vous suffira de changer les options de date pour les faire correspondre au format souhaité.

#!/bin/bash

for i in `ls -l /directroy`
do
cp $i /newDirectory/$i.`date +%m%d%Y`
done
2
Lipongo

Il existe un moyen approprié de diviser le nom de fichier et l'extension: Extraire le nom de fichier et l'extension dans Bash

Vous pouvez l'appliquer comme ceci:

date=$(date +"%m%d%y")
for FILE in folder1/*.csv
do
    bname=$(basename "$FILE")
    extension="${bname##*.}"
    filenamewoext="${bname%.*}"
    newfilename="${filenamewoext}${date}.${extension}
    cp folder1/${FILE} folder2/${newfilename}
done
2
Jan-Philip Gehrcke
path_src=./folder1
path_dst=./folder2
date=$(date +"%m%d%y")
for file_src in $path_src/*; do
  file_dst="$path_dst/$(basename $file_src | \
    sed "s/^\(.*\)\.\(.*\)/\1$date.\2/")"
  echo mv "$file_src" "$file_dst"
done
2
perreal

Vous pouvez être utilisé cette étape est très utile:

for i in `ls -l folder1 | grep -v total | awk '{print $ ( ? )}'`
do
   cd folder1
   cp $i folder2/$i.`date +%m%d%Y`
done
0
kanakaraj. p
cp --archive home/webapps/project1/folder1/{aaa,bbb,ccc,ddd}.csv home/webapps/project1/folder2
rename 's/\.csv$/'$(date +%m%d%Y).csv'/' home/webapps/project1/folder2/{aaa,bbb,ccc,ddd}.csv

Explication:

  • --archive garantit que les fichiers sont copiés avec les mêmes droits de propriété et autorisations.
  • foo{bar,baz} est développé en foobar foobaz.
  • rename est un programme couramment disponible pour effectuer exactement ce type de substitution.

PS: n’utilisez pas ls pour cela .

0
l0b0