PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien durchsuchen und ggf. bei Erfolg verschieben?



meinereinerseiner
03-01-2003, 13:06
Hallo,

ich möchte regelmäßig ein paar Verzeichnisse nach dateien mit bestimmten Inhalten durchsuchen und bei erfolgreicher Suche die betroffenen Dateien Verschieben.
hab dafür folgenden ansatz:



#!/bin/sh

# Pfad zu Datei mit den Suchbegriffen
SEARCH_DB=`cat /home/samba/search/search_db`

# Pfad zum Ordner wo die Dateien mit den Suchbegriffen hinkommen
DIR="/home/samba/search/tmp"

# Pfad zu den Dateien die durchsucht werden sollen (dort gibts keine
# weitern Unterverzeichnisse)
SEARCH_DIRS="/home/andi/files
/home/tom/files
/home/user1/files
/home/samba/wg"


for i in $SEARCH_DIRS; do

cd $i # ins entspr. Verz. wechseln

set `du` # kucken ob verzeichnis leer ist, was dann mit dem "test"
# ausgewertet wird (ist mir nix besseres eingefallen)

if [! "$1" = "4" ]; then

CHECK_FILES=`ls -1 | tail -2` # vorhandenen FIles in $CHECK_FILES packen

for x in $CHECK_FILES; do

for y in $SEARCH_DB: do

# hier weis ich dann nicht weiter:
# kucken ob in den Datein in $CHECK_FILES
# die suchbegriffe aus $SEARCH_DB sind, wenn ja
# die dann nach $DIR moven
# so ala "grep $y $x, wenn ok, mv $x $DIR wenn nicht OK dann
# halt den naechsten begriff
done

done

fi

done

exit 0




kann mir da jemand weiterhelfen???

der tom

micha
03-01-2003, 14:07
Hi,

schau mal, ob das hier macht, was Du willst ( zum Testen kannst Du Zeile 18 (mv....) auskommentieren):



#!/bin/sh

SEARCH_DB="/home/micha/development/scripts/samba/search_db"
SEARCH_DIRS="/home/micha/development/scripts/samba/home/user1/
/home/micha/development/scripts/samba/home/user2/"
DEST_DIR="/home/micha/development/scripts/samba/tmp"

for user in $SEARCH_DIRS
do
echo "Searching in $user..."
while read regex
do
echo "Searching for $regex..."
for file in `grep -R "$regex" $user | cut -d ':' -f -1`
do
name=`basename $file`
echo "Moving $file to $DEST_DIR/$name"
mv $file $DEST_DIR/$name
done
done < $SEARCH_DB
done

exit 0


Gruß micha

meinereinerseiner
03-01-2003, 15:39
HI,

danke für die schnelle antwort!

grep -R ging bei mir nicht musste grep -r draus machen

das script rennt im Prinzip, nur sobald der suchbegriff mehr als 1x pro datei
vorkommt, versucht er die dann auch entsprechend oft zu moven - was ja auf einen fehler läuft.

ja und dann hab ich noch das problem das in den Verzeichnissen dateien liegen welche im dateinamen ein "," und ein "=" enthalten (sind mails vom vpopmail),
die kann ich ja nur moven, wenn ich die mit einem \ maskieren, muss ich
dann vor dem moven das noch mit dem sed bearbeiten wenn ja wie?

der tom

micha
03-01-2003, 16:00
Hi,

das mehrmalige Anzeigen derselben Datei kannst Du bei grep mit dem Parameter -c unterdrücken, bei den Dateinamen müsste es eigentlich reichen, wenn man die Variablen mit den Dateinamen quotiert (ein Testlauf mit cp anstatt mv laufen lassen ;)



#!/bin/sh

SEARCH_DB="/home/micha/development/scripts/samba/search_db"
SEARCH_DIRS="/home/micha/development/scripts/samba/home/user1/
/home/micha/development/scripts/samba/home/user2/"
DEST_DIR="/home/micha/development/scripts/samba/tmp"

for user in $SEARCH_DIRS
do
echo "Searching in $user..."
while read regex
do
echo "Searching for $regex..."
for file in `grep -rc "$regex" $user | cut -d ':' -f -1`
do
name=`basename "$file"`
echo "Moving $file to $DEST_DIR/$name"
mv "$file" "$DEST_DIR/$name"
done
done < $SEARCH_DB
done

exit 0


Gruß micha

meinereinerseiner
03-01-2003, 16:26
das mit dem quotieren des names haut prima hin, die c option beim grep allerdings
tut die sache verschlimmbessern, hab das dann jetzt so geändert:



for file in `grep -r "$regex" $user | cut -d ':' -f -1`
do
name=`basename $file`
if [ -f $file ]; then
echo "Moving $file to $DEST_DIR/$name"
mv "$file" "$DEST_DIR/$name"
fi
done


so tut das jetzt

danke
der tom

AliBaba
06-01-2003, 22:21
Auch wenn die Sache schon funktioniert, wollte ich noch meinen Senf dazugeben.

Dass grep -c nicht hilft, ist eigentlich kein Wunder, es löscht ja keine doppelten Zeilen, sondern *zählt*, wie oft eine Zeile mit dem Suchbegriff vorkommt.

Ich fände es eigentlich ganz hübsch, am Anfang des Scripts mehrfache Zeilen aus der Datei mit den Suchbegriffen rauszuschmeißen, z. B. mit:
sort $SEARCHDB | uniq >$SEARCHDB
(oder als Ziel eine andere Datei, wenn Du die Originaldatei nicht verändern willst).

Christoph
07-01-2003, 12:06
Es gibt eine einfachere Möglichkeit als die Ausgabe von
grep zu parsen:

grep gibt unterschiedliche Returncodes zurück, je nachdem ob
der Suchbegriff gefunden wird oder nicht.
Ausserdem gibts eine Option, nach dem ersten Treffer abzubrechen.

Für Details bittte die man page konsultieren.