2010-12-09 52 views
1

Hey tout le monde! Je suis assez nouveau pour le script shell et je suis coincéextraire des informations sur: taille && heure && row_count dans un script de ligne shell

J'ai besoin d'extraire des informations concernant: nom_fichier & & taille & & temps & & row_count et je veux faire en une ligne de commande. J'ai essayé comme ceci:

ls -l * && wc -l file.txt && du -ks file.txt | cut -f1| awk '{print $5" " $6 " " $7 " "$8 " " $9 " "$1 " "$2}' 

mais ne fonctionne pas correctement

J'ai aussi essayé faire en boucle, mais je ne sais pas comment l'extrait de là

for file in `ls -ltr /export/home/oracle/dbascripts/scripts` 
do 
[[ -f $file ]] && echo $file | awk '{print $3}' 
done 

Ensuite, je veux rediriger le fichier comme ceci >> pour le but de chargeur de sql. Merci d'avance!

+1

http://mywiki.wooledge.org/ParsingLs –

+0

Quel système d'exploitation? Linux, BSD, Solaris, HP-UX? –

+0

n'est pas BSD, HP-UX => c'est SunOS – Alper

Répondre

0

Cela pourrait être un début si vous avez GNU trouver et GNU coreutils (plus de distribution Linux fera):

for i in /my/path/*; do 
    find "$i" ! -type d -printf '%p %TY-%Tm-%Td %TH:%TM:%TS %s ' 

    wc -l <"$i" 
done 

/my/path/* devrait être modifié pour tenir compte des fichiers que vous souhaitez sonder.

Gardez également à l'esprit que ce one-liner a quelques problèmes majeurs si des répertoires sont spécifiés. Cela devrait être plus sûr à cet égard:

for i in *; do 
    if [[ -d "$i" ]]; then 
     continue 
    fi 

    find "$i" -printf '%p %TY-%Tm-%Td %TH:%TM:%TS %s ' 

    wc -l <"$i" 
done 

Vous voulez voir la page de manuel pour GNU find pour mieux comprendre cela.

EDIT:

Il y a au moins un autre moyen plus rapide, en utilisant join et substitution processus bash, mais il est un peu moche et un peu plus difficile à sécuriser et à travailler les petits défauts de.

+0

Cela fonctionne dans Ubuntu mais pas dans SunOS 5.0 problème avec cette commande -printf '% p% TY-% Tm-% Td% TH:% TM:% TS% s' ; peut-être il ya une autre façon d'extraire des informations après trouver fichier – Alper

+0

@Alper: La commande find dans SunOS (en particulier une ancienne version comme 5.0 - AFAIK la fin de vie de cette version est venue avant le nouveau millénaire) est _very_ simple en comparaison avec GNU trouver. Je pense que la commande stat, qui pourrait aider ici, est également manquante. D'autres commandes sont forcément paralysées par rapport à leurs versions BSD/GNU. Pour le moment je ne peux pas penser à une alternative à l'analyse de ls (beurk). Si vous avez besoin d'aide, éditez votre question et ajoutez un échantillon de la sortie de 'ls -l' dans votre système. – thkala

+0

allmost a fait, mais ne semble pas si cool peut-être suggérer un moyen de l'améliorer – Alper

0
ExtractInformation() 
{ 
timesep="-" 
sep="|" 
dot=":" 
sec="00" 

lcount=`wc -l < $fname` 
modf_time=`ls -l $fname` 
f_size=`echo $modf_time | awk '{print $5}'` 
time_month=`echo $modf_time | awk '{print $6}'` 
time_day=`echo $modf_time | awk '{print $7}'` 
time_hrmin=`echo $modf_time | awk '{print $8}'` 
time_hr=`echo $time_hrmin | cut -d ':' -f1` 
time_min=`echo $time_hrmin | cut -d ':' -f2` 
time_year=`date '+%Y'` 
time_param="DD-MON-YYYY HH24:MI:SS" 
time_date=$time_day$timesep$time_month$timesep$time_year" "$time_hrmin$dot$sec 


result=$fname$sep$time_date$sep$f_size$sep$lcount$sep$time_param 


sqlresult=`echo $result | awk '{FS = "|" ;q=sprintf("%c", 39); print "INSERT INTO SIP_ICMS_FILE_T(f_name, f_date_time,f_size,f_row_count) VALUES (" q $1 q ", TO_DATE("q $2 q,q $5 q "),"$3","$4");";}'` 

echo $sqlresult>>data.sql 
echo "Reading data....." 
} 

UploadData() 
{ 
#ss=`sqlplus -s a/[email protected] @data.sql 
#set serveroutput on 
#set feedback off 
#set echo off` 
echo "loading with sql Loader....." 
} 

f_data=data.sql 
[[ -f $f_data ]] && rm data.sql 
for fname in * ; 
do 
if [[ -f $fname ]] then 
ExtractInformation 
fi 
UploadData 
#Zipdata 
done