Ich erstelle ein Shell-Skript, um Eingaben aus CSV-Dateien mit zwei Zeilen zu übernehmen (eine Spalte gibt die Zeit an, die andere die Dateizeichenfolge). Mein Skript funktioniert, wenn es nur eine Zeile gibt, aber es funktioniert nicht bei mehreren Zeilen. Außerdem weiß ich nicht, in welcher Zeile es nach den Dateien sucht, da es diese nicht gefunden hat.
Beispieldatei:
1300,N213
1245,N218
1400,N222
1600,N225
Code, ich versuche, ihn zum Laufen zu bringen.
#!/bin/bash
tr_filepath=/var/opt/data/nms_umts_pms_seg/segment1/
echo "Folder to search for traces ${tr_filepath}"
tr_newpath=/var/opt/ericsson/nms_umts_pms_seg/segment1/edos/4G/
CNTRL_FILE=/home/vx622325/filematch.csv
echo "File Contents of ${CNTRL_FILE} to match with pattern"
for i in $CNTRL_FILE;
do
t=$(cat $i | awk -F"," '{ print $1}')
n=$(cat $i | awk -F"," '{ print $2}')
X=`find "$tr_filepath" -type f -iname "A*."$t"*,*="$n"*.bin.gz"`
echo -e "Traces To Copy \n $X\n" >> /home/vx622325/result_`date +"%d_%m_%Y"`.csv
if [ -d "$tr_newpath" ]; then
y= cp -rp $X $tr_newpath
else
echo "Output folder $tr_newpath not found" > /home/vx622325/result_`date +"%d_%m_%Y"`.csv
fi
done
Zu suchende Dateien
A20190118.2200+0300-2201+0300_SubNetwork=ONRM_RootMo,SubNetwork=N213,MeContext=N213,ManagedElement=1_rnc_gpehfile_Mp0.bin.gz
A20190118.2200+0300-2201+0300_SubNetwork=ONRM_RootMo,SubNetwork=N213,MeContext=N213,ManagedElement=1_rnc_gpehfile_Mp10.bin.gz
A20190118.2200+0300-2201+0300_SubNetwork=ONRM_RootMo,SubNetwork=N213,MeContext=N213,ManagedElement=1_rnc_gpehfile_Mp11.bin.gz
Antwort1
Vereinfachtes Skript, das davon ausgeht, dass die Datei ~vx622325/filematch.csveineeinfachCSV-Datei (ohne eingebettete Zeilenumbrüche oder Kommas):
#!/bin/sh
tr_filepath=/var/opt/data/nms_umts_pms_seg/segment1
tr_newpath=/var/opt/ericsson/nms_umts_pms_seg/segment1/edos/4G
result_out=~vx622325/$( date +'result_%d_%m_%Y.log' )
if [ -d "$tr_newpath" ]; then
printf 'Destination does not exist: %s\n' "$tr_newpath" >"$result_out"
exit 1
fi
set --
while IFS=, read -r a b; do
set -- "$@" -o -name "A*.$a*,*=$b*.bin.gz"
done <~vx622325/filematch.csv
shift # removes the initial "-o"
find "$tr_filepath" -type f \( "$@" \) -exec sh -c '
dest=$1; shift
cp "$@" "$dest"/
printf "Copied: %s\n" "$@"' sh "$tr_newpath" {} + >"$result_out"
Dadurch wird jeder Datensatz aus der CSV-Eingabedatei mithilfe von read(mit einem Komma als Feldtrennzeichen) in die beiden Variablen aund eingelesen b.
Die Variablen werden zum Erstellen von OR-verknüpften -nameMustern für verwendet find.
findwird dann verwendet, um nach Dateien zu suchen, deren Namen den Mustern entsprechen. Die Dateien werden stapelweise in das Zielverzeichnis kopiert und ihre Namen in der Ausgabedatei aufgezeichnet.
Mit GNU-Tools können Sie Folgendes tun:
#!/bin/bash
tr_filepath=/var/opt/data/nms_umts_pms_seg/segment1
tr_newpath=/var/opt/ericsson/nms_umts_pms_seg/segment1/edos/4G
printf -v result_out '%s/result_%(%d_%m_%Y)T.log' ~vx622325 -1
if [ -d "$tr_newpath" ]; then
printf 'Destination does not exist: %s\n' "$tr_newpath" >"$result_out"
exit 1
fi
namepats=()
while IFS=, read -r a b; do
namepats+=( -o -name "A*.$a*,*=$b*.bin.gz" )
done <~vx622325/filematch.csv
find "$tr_filepath" -type f \( "${namepats[@]:1}" \) \
-exec cp -t "$tr_newpath"/ {} + \
-printf 'Copied: %p\n' >"$result_out"
Antwort2
Wie von msp9011 erwähnt, liegt das Problem bei
for i in $CNTRL_FILE
wo der Dateiname angegeben wird, wo Sie den Inhalt der Datei angeben sollten. Einfacher Weg ist, die Datei fertigzustellen und den internen Feldtrenner (IFS) wie folgt einzustellen
while IFS=, read -r column1 column2
do
echo "column1 : $column1, column2 : $column1"
#Take action using input
done < $CNTRL_FILE


