staging.inyokaproject.org

Script/ laufendes find abbrechen

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Bitte um Hilfe.

Muss im Supportbereich noch eine Faden zu dem Thema(Find Frontend) aufmachen. Script war in die Jahre gekommen, nun etwas geändert.(wollte das so nicht einstellen) Im Prinzip läuft das Script.

Problem ist Abbruch von find + etc.

  1. Wie an $!(find) in den Zeilen 91 und 106 kommen?

  2. tee .... läuft u.U. weiter

  3. (-exec) file --mime-type läuft u.U. weiter

In Zeile 44 ist Abbruch Funktion vorhanden.

Falls sonst noch was nicht OK ist..

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/bin/bash
#exec 2>> $HOME/find-frontend.log
#set -x
scriptpfad=$(readlink -f $0)
findgesamt=~/.cache/findgesamt.txt
findselektiert=~/.cache/findselektiert.txt
#definiere Standard Tiefe bei 0
tiefebeinull=10
dir1=~/.cache/finddir1
dir2=~/.cache/finddir2

if [ "$1" ]; then
	if [ -d "$1" ]; then
		dir="$1"
		echo "$dir" > $dir1
	fi
else
	read dir < $dir1
fi
#notify-send "$dir"

findaktiv-f() {
sleep 0.5
(yad --title="find_ist_aktiv" \
  --progress \
  --pulsate \
  --text-align=center \
  --text=": $1" \
  --no-focus \
  --on-top \
  --geometry=350x20-30-30 \
  --no-buttons)&
  #--undecorated
sleep 1
findaktiv=1
while [ "$findaktiv" -eq "1" ]
do
	if [ "$(pidof find)" ]; then findaktiv=1;else findaktiv=0;fi
	sleep 0.5
done
killwin=$(xdotool search --name "find_ist_aktiv" getwindowpid)
if [ "$killwin" ]; then kill $killwin;fi
}
killfind-f() {
	killall -9 find
}

################### YAD Eingabe ############################
yadeingabe=$(yad --title="Dateien suchen - Muster eingeben" \
	--width=500 --center --borders=40 --buttons-layout=center \
	--form --selectable-labels \
	--separator=";" \
	--text="https://wiki.ubuntuusers.de/find/\n-mmin -20\n-mtime -3   # jünger als 3 Tage, + und - kann gesetzt werden\n-n-amin -5   # sucht nach Dateien, auf die zuletzt vor n bis n+1 zugegriffen (a=accessed)\n-size +512k  -size +100M  -size +1G" \
	--field=Muster "**" \
	--field=Param "" \
	--field="Groß Kleinschreibung ignorieren:CHK" true \
	--field="Tiefe:NUM" 0 \
	--field="Ordner:DIR" "$dir" \
	--field="Anwen:CBE" featherpad\!mpv\!okular\!gwenview\!vlc\!audacious \
	--field="Bilder:CHK" false \
	--field="Video:CHK" false \
	--field="Audio:CHK" false \
	--field="Text:CHK" false \
	--button="kfind":"kfind $dir" \
	--button="Catfish":"catfish --path=$dir" \
	--button="Beenden":1 \
	--button="OK":0)
ret=$?;if ! [ "$ret" -eq "0" ]; then exit;fi
muster=$(echo "$yadeingabe" | awk -F ";" {'print $1'})
parameter=$(echo "$yadeingabe" | awk -F ";" {'print $2'})
namegrossklein=$(echo "$yadeingabe" | awk -F ";" {'print $3'})
tiefe=$(echo "$yadeingabe" | awk -F ";" {'print $4'})
ordner=$(echo "$yadeingabe" | awk -F ";" {'print $5'})
anwendung=$(echo "$yadeingabe" | awk -F ";" {'print $6'})
if [ "$(echo "$yadeingabe" | awk -F ";" {'print $7'})" == "TRUE"  ]; then mime=image;fi
if [ "$(echo "$yadeingabe" | awk -F ";" {'print $8'})" == "TRUE"  ]; then mime=video;fi
if [ "$(echo "$yadeingabe" | awk -F ";" {'print $9'})" == "TRUE"  ]; then mime=audio;fi
if [ "$(echo "$yadeingabe" | awk -F ";" {'print $10'})" == "TRUE" ]; then mime=text;fi

echo "$ordner" > $dir1

################### find ############################
if [ "$namegrossklein" == "TRUE" ]; then name="-iname"; else name="-name";fi
if [ "$tiefe" -eq "0" ]; then tiefe="-maxdepth $tiefebeinull";else tiefe="-maxdepth $tiefe";fi    

if [ "$muster" == "**" ] || [ "$muster" == "*" ]; then muster2=nv;fi
(findaktiv-f $muster2)&

export -f killfind-f
if [ "$mime" ]; then
	find "$ordner" $tiefe -type f $parameter $name "$muster" -exec file --mime-type {} \+ | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' | tee $findgesamt | yad \
	--title "Dateien suchen - Ergebnis" \
	--separator=" " --borders=1 --buttons-layout=center \
	--width=1000 --height=600 --center --list \
	--selectable-labels \
	--text="find $ordner $tiefe $parameter $mime  Muster:$muster\n$anwendung" \
	--button="Neue Suche":"$scriptpfad &" \
	--button="Gesamtliste":"xdg-open $findgesamt" \
	--button="D.kopieren nach":10 \
	--button="Stop find":"bash -c 'killfind-f'" \
	--button="Beenden":1 \
	--button="OK":0 \
	--column "Files" --multiple > $findselektiert
	ret=$?
else
	find "$ordner" $tiefe -type f $parameter $name "$muster" | tee $findgesamt | yad \
	--title "Dateien suchen - Ergebnis" \
	--separator=" " --borders=1 --buttons-layout=center \
	--width=1000 --height=600 --center --list \
	--selectable-labels \
	--text="find $ordner $tiefe $parameter  Muster:$muster\n$anwendung" \
	--button="Neue Suche":"$scriptpfad &" \
	--button="Gesamtliste":"xdg-open $findgesamt" \
	--button="D.kopieren nach":10 \
	--button="Stop find":"bash -c 'killfind-f'" \
	--button="Beenden":1 \
	--button="OK Anw.":0 \
	--column "Files" --multiple > $findselektiert
	ret=$?
fi

if [ "$ret" -eq "1" ] || [ "$ret" -eq "252" ]; then
	killfind-f
	exit
fi
if [ ! -s $findgesamt ]; then notify-send "Suchfehler, Abbruch";exec $scriptpfad;exit;fi
if [ ! -s $findselektiert ]; then notify-send "Keine Dateien ausgewählt, Abbruch";exec $scriptpfad;exit;fi
if [ "$ret" -eq "10" ]; then
	read dir < $dir2
	dir=$(yad --center --file --directory --filename="$dir" --width=900 --height=600)
	ret=$?;if [ "$ret" -ne "0" ]; then exit;fi
	echo "$dir" > $dir2
	while read -r line
	do
    	cp "$line" "$dir"
	done < $findselektiert
	xdg-open "$dir"
	exit
fi

#if [ "$ret" -ne "0" ]; then exit; fi
$anwendung $(cat $findselektiert)

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Hallo,

Kannst du nicht einfach den Befehl in den Hintergrund schicken und dann über die PID den Prozess beenden?

1
2
3
Befehl &
cmdpid="$!"
kill "$cmdpid"

Gruß

Carsten

Marantkurz

(Themenstarter)

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Einer geht von 91 bis 103. Dennoch probiert, wie zu vermuten war es yad, was dran glauben musste. Also, knapp daneben, leider. Keine Ahnung ob sich vor den Pipes einklinken lässt, vmtl. könnte rückwärts zum Erfolg führen.

..etwas schlauer:

find-frontend.s(553429)─┬─awk(553583)
                        ├─find(553582)───file(553902)
                        ├─find-frontend.s(553580)─┬─sleep(554662)
                        │                         └─yad(553581)─┬─{yad}(553587)
                        │                                       ├─{yad}(553589)
                        │                                       ├─{yad}(553592)
                        │                                       └─{yad}(553593)
                        ├─tee(553585)
                        └─yad(553586)─┬─{yad}(553588)
                                      ├─{yad}(553590)
                                      ├─{yad}(553591)
                                      └─{yad}(553594)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Was ist denn das kürzeste Programm, mit dem Du das Problem darstellen kannst?

Ruhig so kurz, dass es nicht mehr nützlich ist, außer um das Problem zu zeigen.

Was ist denn $!(find) - das ist mir nicht geläufig.

1
2
3
killfind-f() {
	killall -9 find
}

Das killt ALLE laufenden find-Prozesse, sofern Du dafür Killrechte hast, auch wenn die gar nicht von deinem Script gemanaged werden, sondern in einem anderen Terminal laufen. Ist das das was Du willst?

Und wieso eine Funktion, wenn es nur ein Befehl ist mit einem Zeichen mehr zu tippen? Wieso Signal 9?

Marantkurz

(Themenstarter)

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Das killt ALLE laufenden find-Prozesse, sofern Du dafür Killrechte hast,

Schon kar, ich schrieb ja auch davon, dass ich $! brauche und zwar von

Was ist denn das kürzeste Programm, mit dem Du das Problem darstellen kannst?

91 find "$ordner" $tiefe -type f $parameter $name "$muster" -exec file --mime-type {} \+ | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' | tee $findgesamt | yad \

also find,awk,tee, siehe Bsp: awk(553583),tee(553585),..find(ausser yad)

Ich habe mir überlegt die Sache sein zu lassen. Nutze das Script selbst nicht(mehr).(vmtl. würde im Forum auch Niemand.)(nehme für die find Sachen mittlerweile nur noch find+(Launcher) Rofi. so besseres UI.

Falls das Jmd dennoch tuen will und die kleineren Baustellen* rausnimmt, eine Warnung: cp braucht noch einen Dialog, überschreibt momentan ohne Hinweis wenn Datei(en) vorhanden.(*bei findaktiv-f noch xdotool raus(dafür etwa while [ "$(pidof find)" ])(besser korrekte pid), bei Restart das Einlesen des "dir" Pfades.)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Nun, die Frage war:

Was ist denn das kürzeste Programm, mit dem Du das Problem darstellen kannst?

Und

1
91 find "$ordner" $tiefe -type f $parameter $name "$muster" -exec file --mime-type {} \+ | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' | tee $findgesamt | yad \

Ist kein Programm, sondern eine Programmzeile mit Zeilennummer, am Ende mit dem Fortsetzungszeichen also nicht mal eine komplette Programmzeile; "ordner", "muster" usw. sind nirgends initialisiert also ungesetzt.

Um ein Problem zu lösen muss man es erst mal eingrenzen. Wenn ich Dich recht verstehe, willst Du find vorzeitig beenden und das klappt nicht oder nicht so wie gewollt.

Spielt dabei die Tiefe der Suche eine Rolle? Vermutlich nicht.

Also schmeißt Du aus Deinem Demoprogramm für den Fehler die Tiefe raus.

1
find "$ordner" -type f $parameter $name "$muster" -exec file --mime-type {} \+ | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' | tee $findgesamt 

Wenn Du einen Ordner mit 2-3 Testdaten anlegst, muss beim Findaufruf kein Ordner angegeben werden, wenn Du das Programm aus diesem startest.

Dass (man mit) find Schwierigkeiten mit Namen hat, ist nicht zu vermuten, solange nicht Leerzeichen und ähnlicher Zinnober darin vorkommen.

1
find -type f -exec file --mime-type {} \+ | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' | tee $findgesamt 

Das Pluszeichen muss nicht maskiert werden, da es von der Bash sowieso nicht interpretiert wird.

1
find -type f -exec file --mime-type {} + | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' | tee $findgesamt 

Was ist mit dem tee $findgesamt? Ist auch wieder beim Aufruf leer. Tritt das Problem auch ohne tee auf - dann mach ein Demoprogramm ohne tee, zeig Deine 2-3 Testdateien (Name, Inhalt; am besten ein Script welches diese beim hilfsbereiten User erzeugt, so dass er es bei sich nachstellen kann), den Output ohne tee und dann mit tee. Wenn das Problem unabhängig vom tee existiert, schmeiß es im Democode raus, bis das Problem ohne tee das tut, was es soll, und dann versuche das tee zuzufügen, ohne etwas kaputt zu machen.

1
find -type f -exec file --mime-type {} + | awk -v search="$mime" -F: '{if ($2 ~ search"/") print $1}' 

Was soll das awk-Programm machen? Ich vermute, wenn ein File "text/plain" oder sonst ein Text ist, und der User hat als Suche "text" ausgewählt, dass dann der Filename ausgegeben werden soll, sonst nichts. Ist das so? Funktioniert es, wenn man den Rest mit yad weglässt?

Zum Testen des Rests müsste man es also eindampfen können auf

1
find -exec file --mime-type {} + | awk -F: '{if ($2 ~ "text/") print $1}' 

(Ohne Unterverzeichnisse im Testverzeichnis können wir auch das -type f rauskicken.)

Ich erzeuge also 4 Dateien:

1
2
3
4
5
6
echo test > foobar 
echo "#include bar.h" > foo.c 
echo -en '#!/bin/bash\nls\n' > bar.sh
echo -e '\f\010\014\002' > barfoo.bin 
# Dann ergibt der Findbefehl alleine 
find . -type f -exec file --mime-type {} + 
1
2
3
4
./foobar: text/plain
./foo.c:  text/x-c
./bar.sh: text/x-shellscript
./barfoo.bin: application/octet-stream

und mit awk-Pipeline:

1
find . -type f -exec file --mime-type {} + | awk -F: '{if ($2 ~ "text/") print $1}'

ergibt es:

1
2
3
./foobar
./foo.c
./bar.sh

Wenn ich das jetzt an yad weiterleite, etwa so:

1
2
3
4
5
6
7
8
9
find . -exec file --mime-type {} + | awk -F: '{if ($2 ~ "text/") print $1}' | yad \
		--title "Dateien suchen - Ergebnis" \
		--separator=" " \
		--list \
		--selectable-labels \
		--button="Stop find":"pkill find" \
		--button="Beenden":1 \
		--button="OK":0 \
		--column "Files" --multiple > .findselektiert.txt; ret=$?; echo $ret; ls -lAG

dann (ich kenne mich mit yad nicht aus) bleibt .findselektiert.txt leer, der "Stop find"-Button scheint keine Auswirkung zu haben, Beenden bzw. OK liefern 1 oder 0 als Ergebnis in $ret.

Da find so viele Dateien wie möglich an file liefert ist find auch schon fertig, wenn yad das Fenster öffnet. Wieso willst Du überhaupt find abwürgen? Und wieso mit Signal 9 wurde auch nicht beantwortet. Das nicht zu wissen ist nicht ehrenrührig, es nicht wissen zu wollen, schon.

Ich glaube, das kann gar nicht klappen, selbst wenn find mehr als 4 Dateien liefert, sagen wir 4000 - yad wird immer warten, bis alle da sind, oder? Bei 40.000 Files ist ein grafisches Programm, wo man einzelne Einträge listen kann, keine Erleichterung der Aufgabe mehr.

MS hat mal versucht, mit MS-Access ein Programm zu schaffen, um SQL-Statements zu visualisieren bzw. grafisch zusammenzusetzen, was bei 2-3 verknüpften Tabellen, mit 4-5 selektierten Spalten auch noch übersichtlich war, abgesehen davon, dass sie ohne Not immer "Domainname"."Tabellenname"."Spalte" in das SQL gepackt haben, auch da, wo spalte schon eindeutig war und keinerlei Maskierung bedurft hätte - dadurch wurde das SQL immer monströs und quasi unbrauchbar, und hübsch umgebrochen und eingerückt wurde auch nichts - kann sich aber in den letzten 20 Jahren auch gebessert haben.

Ich glaube, ein ähnliches Problem ist Versuchen beschieden, find grafisch umzusetzen: Es gibt unzählige Parameter in verschiedensten Permutationen vorkommen dürfen, bei einigen davon spielt die Reihenfolge eine Rolle, mit UND und ODER ergeben sich mannigfache Verknüpfungsmöglichkeiten. Die radikale Einschränkung der Möglichkeiten sorgt dafür, dass die Leute doch find lernen müssen, wovon sie am Ende mehr haben.

Marantkurz

(Themenstarter)

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Oh je, so viel Arbeit hast Du Dir gemacht, ich frage mich alldgs., Warum? Das Script läuft, lediglich der vorzeitige Abbruch braucht einige pid's. Also, Das was bei pstree zu sehen ist.

Ich bekomme das auch selbst hin. Script pid, von da aus wurde find, awk und tee ausgelöst.

Ich glaube, ein ähnliches Problem ist Versuchen beschieden, find grafisch umzusetzen: Es gibt unzählige Parameter in verschiedensten Permutationen

Sicher, das Script hatte aber nie den Anspruch allem Möglichkeiten zu genügen, sondern lediglich Vieles davon einfach und schnell zu ermöglichen. Mir hat es gute Dienste geleistet in den letzten Jahren.(hatte aber da auch den vorzeitigen Abbruch nicht anders drin, hat gereicht. Es fällt ja auch nicht auf, die Prozesse außer find laufen dann halt etwas weiter..)

Ist kein Programm, sondern eine Programmzeile mit Zeilennummer, am Ende mit dem Fortsetzungszeichen also nicht mal eine komplette Programmzeile; "ordner", "muster" usw. sind nirgends initialisiert also ungesetzt.

Unnötig! Hast Du ins falsche Script gekuckt? Oder überhaupt nicht Da rein? Von Anfang bis Ende habe ich in dem Faden gesagt was ich wollte, unverständlich? Wir können auch über das Wetter reden..

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Marantkurz schrieb:

Oh je, so viel Arbeit hast Du Dir gemacht, ich frage mich alldgs., Warum? Das Script läuft, lediglich der vorzeitige Abbruch braucht einige pid's.

Warum? Um Dir zu zeigen, wie man eine gescheite Frage stellt, nämlich in dem man einen lauffähigen Code postet, der aber um allen Schnickschnack, der zur Reproduktion des Fehlers/Problems nicht nötig ist, weglässt.

Schon beim Reduzieren des Problems auf das Wesentliche findet man selbst oft den Fehler, etwa weil man etwas Nebensächliches wegzulassen probiert, und dabei feststellt, dass in dieser Nebensache der Fehler steckte.

Oder man hat das Problem so stark eingegrenzt, dass der Fehler in seiner strahlenden Pracht offen vor einem liegt.

Ich bekomme das auch selbst hin. Script pid, von da aus wurde find, awk und tee ausgelöst.

Und wenn Du das Skript terminierst laufen find/awk/tee/... weiter?

Ich glaube, ein ähnliches Problem ist Versuchen beschieden, find grafisch umzusetzen: Es gibt unzählige Parameter in verschiedensten Permutationen

Sicher, das Script hatte aber nie den Anspruch allem Möglichkeiten zu genügen, sondern lediglich Vieles davon einfach und schnell zu ermöglichen. Mir hat es gute Dienste geleistet in den letzten Jahren.(hatte aber da auch den vorzeitigen Abbruch nicht anders drin, hat gereicht. Es fällt ja auch nicht auf, die Prozesse außer find laufen dann halt etwas weiter..)

Ist kein Programm, sondern eine Programmzeile mit Zeilennummer, am Ende mit dem Fortsetzungszeichen also nicht mal eine komplette Programmzeile; "ordner", "muster" usw. sind nirgends initialisiert also ungesetzt.

Unnötig! Hast Du ins falsche Script gekuckt? Oder überhaupt nicht Da rein? Von Anfang bis Ende habe ich in dem Faden gesagt was ich wollte, unverständlich? Wir können auch über das Wetter reden..

Enthält mein abgespeckter Teil des Skripts nicht den Code, der Dir Probleme bereitete?

Man speckt sein Problem ab, damit andere damit leichter und schneller klarkommen. 15 Zeilen Code analysiert man lieber als 140.

Marantkurz

(Themenstarter)

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Sinnlos.

Oh je, so viel Arbeit hast Du Dir gemacht,

Du glaubst das war ernst gemeint?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Marantkurz: Du hast den ersten Beitrag mit „Bitte um Hilfe.“ angefangen. Das schien dann also auch nicht ernst gemeint. Wäre nett wenn Du so etwas deutlicher kennzeichnen würdest, damit keiner Zeit mit einer Antwort verschwenden muss. 🫤

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

user_unknown schrieb:

Um Dir zu zeigen, wie man eine gescheite Frage stellt, nämlich in dem man einen lauffähigen Code postet, der aber um allen Schnickschnack, der zur Reproduktion des Fehlers/Problems nicht nötig ist, weglässt.

Schon beim Reduzieren des Problems auf das Wesentliche findet man selbst oft den Fehler, etwa weil man etwas Nebensächliches wegzulassen probiert, und dabei feststellt, dass in dieser Nebensache der Fehler steckte.

Genau. Man kann das ausführlich bei sscce.org 🇬🇧 nachlesen.

Marantkurz

(Themenstarter)

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Das schien dann also auch nicht ernst gemeint.

Natürlich nicht. Ich hatte lange Weile und dachte "Was denn Heute bei uu.de einstellen?" Oh seeliger Gott, die Antwort kam und auch die Vorfreude. Die Vorfreude auf "sinngemäß: Muss ich wirklich Dein Script ansehen?, oder Stelle bitte Deine Fragen so wie es mir passt".

Nun ja. Ich verzichte einfach in den Bereich noch was einzustellen. Damit werden dann Alle glücklich sein.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Schau,

  • Du fragst nicht so, wie wir uns das wünschen

und

  • wir antworten nicht, wie Du Dir das wünschst

so ist jeder bedient. 😉

Wenn Du hier wirklich keine Fragen mehr einstellst, muss ich Dir wohl in anderen Subforen nachstellen, um Erfolg bei der nächsten Interaktion zu haben.

Marantkurz

(Themenstarter)

Anmeldungsdatum:
7. September 2023

Beiträge: 941

edit

Der Ob. ist wieder raus. Hatte das Thema eh abgeschlossen.

Antworten |