Hallo, ik was wat aan het prutsen met bash afgelopen maand en tracht nu een script te schrijven.
De bedoeling is dat het script doorheen mappen kan zoeken naar bestanden met een bepaalde extensie. De extensie wordt aangegeven met argument -e, de mappen worden gedefinieerd door de argumenten zonder '-optie'. De uitvoer is in 2 kolommen waarbij de gevonden bestanden in kolom 1 staan en de respectievelijke map in kolom 2.
Is het mogelijk mijn script even door te nemen en me te vertellen of dit wel de meest efficiënte of flexibele manier is die ik gekozen heb? Flexibel omdat er opties moeten worden toegepast.
Verder lukt het me ook niet om het '-l commando' werkende te krijgen. Enig idee wat er mee scheelt? De extensie invoeren door een variabele in de '-name tag' van 'find' te gebruiken lukt wel, maar voor de eerste letter van een woord dan weer niet? Alsook hoe kan je het script laten herkennen dat er een range gebruikt wordt? Met een if-functie die zoekt naar een '-'?
Ik denk dat het me wel gelukt is een block device te mounten op die manier, maar hoe kan ik het pad daarvan dan instellen als een extra parameter? Het pad toewijzen aan een nummer variabele lijkt niet te lukken.
Dan lukt het bijvoorbeeld wel perfect om de 'no recursion' tag te gebruiken, maar 'no numbers' dan weer niet. Hoe is dit verschillend van elkaar?
Voor de 'no recusion' (nn) en 'no numbers' (nr) tags gebruik ik een lange tag en dien dus ook '--' voor de opties in te voeren. Is het mogelijk om slechts 1 liggend streepje te gebruiken? Dit is normaal gezien niet mogelijk met getopt. Met getopts dan weer wel, maar daarbij slaag ik er niet in om de argumenten zonder '-tag' nog te gebruiken. Iemand enig idee hoe dit oplosbaar is?
En tenslotte, is het mogelijk dat wanneer ik 2 bestanden met dezelfde naam vind, hij dit slechts 1 maal weergeeft, maar wel witregels houdt zodat er rechts nog de respectievelijke map bij staat.
Alvast bedankt voor de hulp en tips die me op de goede weg zouden kunnen helpen!
De bedoeling is dat het script doorheen mappen kan zoeken naar bestanden met een bepaalde extensie. De extensie wordt aangegeven met argument -e, de mappen worden gedefinieerd door de argumenten zonder '-optie'. De uitvoer is in 2 kolommen waarbij de gevonden bestanden in kolom 1 staan en de respectievelijke map in kolom 2.
Is het mogelijk mijn script even door te nemen en me te vertellen of dit wel de meest efficiënte of flexibele manier is die ik gekozen heb? Flexibel omdat er opties moeten worden toegepast.
Verder lukt het me ook niet om het '-l commando' werkende te krijgen. Enig idee wat er mee scheelt? De extensie invoeren door een variabele in de '-name tag' van 'find' te gebruiken lukt wel, maar voor de eerste letter van een woord dan weer niet? Alsook hoe kan je het script laten herkennen dat er een range gebruikt wordt? Met een if-functie die zoekt naar een '-'?
Ik denk dat het me wel gelukt is een block device te mounten op die manier, maar hoe kan ik het pad daarvan dan instellen als een extra parameter? Het pad toewijzen aan een nummer variabele lijkt niet te lukken.
Dan lukt het bijvoorbeeld wel perfect om de 'no recursion' tag te gebruiken, maar 'no numbers' dan weer niet. Hoe is dit verschillend van elkaar?
Voor de 'no recusion' (nn) en 'no numbers' (nr) tags gebruik ik een lange tag en dien dus ook '--' voor de opties in te voeren. Is het mogelijk om slechts 1 liggend streepje te gebruiken? Dit is normaal gezien niet mogelijk met getopt. Met getopts dan weer wel, maar daarbij slaag ik er niet in om de argumenten zonder '-tag' nog te gebruiken. Iemand enig idee hoe dit oplosbaar is?
En tenslotte, is het mogelijk dat wanneer ik 2 bestanden met dezelfde naam vind, hij dit slechts 1 maal weergeeft, maar wel witregels houdt zodat er rechts nog de respectievelijke map bij staat.
code:
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
| #!/bin/bash #FUNCTIONS #Foutmelding #Wordt ook naar error file geschreven fout() { echo 1>&2; echo "Fout, onvoldoende argumenten" 1>&2; echo "Gebruik: $0 [-e <extensie>] [<folder>]" 1>&2; echo "Gelieve de extensie op te geven met argument -e en minstens 1 map waarin gezocht moet worden naar die extensie." 1>&2; echo "Voor meer info gelieve Help te raadplegen met argumenten -h of --help." 1>&2; echo 1>&2; exit } #Help help() { echo echo "--- Help ---" echo echo "Dit script gaat op zoek naar bestanden met een bepaalde extensie, in één of meerdere directories. De output geeft weer welke bestanden gevonden werden, gevolgd door de directory waar het respectievelijke bestand zich bevindt." echo echo "De het argument -e <ext> is vereist, anders kan er geen extensie gevonden worden." echo "Andere argumenten zijn de te doorzoeken directories." echo echo "Verder bevat dit script de volgende optionele argumenten:" echo "-h of --help geeft dit help-document weer." echo "-l <letter> zoekt enkel bestanden, die beginnen met de letter <letter>." echo "-l <letter1>-<letter2> doet hetzelfde, maar zoekt alles van <letter1> t.e.m <letter2>." echo "-b <block-device> laat toe een partitie te doorzoeken, door ze (automatisch) te mounten in de directory /mnt en dan nadien deze directory te gaan doorzoeken." echo "--nn (no numbers) belet dat in een bestandsnaam een cijfer 0 tot 9 voorkomt." echo "--nr (no recursion) voorkomt dat je programma ook in onderliggende directories gaat zoeken." echo "-f of –-fout <bestand> schrijft mogelijke fouten die optreden (bvb een niet-leesbare directory) weg naar het bestand <bestand>." echo "-s <woord> zoekt binnen de gevonden bestanden het woord <woord>, en geeft enkel die bestanden weer die ook dit woord bevatten." echo exit } #VARS #getopt uitvoeren OPTS=$(getopt -o e:hl:b:f:s: -l "help,nn,nr,fout" -n "ExamenScript" -- "$@"); #Slechte opties if [ $? -ne 0 ]; then fout; exit fi #Opties verplaatsen eval set -- "$OPTS"; #echo "AFTER SET -- \$OPTS: $@"; while true; do case "$1" in -e) shift; if [ -n "$1" ]; then EXT=$1; shift; fi ;; -h|--help) shift; help; ;; -l) shift; if [ -n "$1" ]; then CHAR=$1; shift; fi ;; -b) shift; if [ -n "$1" ]; then sudo mkdir /mnt/$1; sudo echo -e "/dev/$1 /mnt/$1 vfat defaults 0 0 " >> /etc/fstab; sudo mount -a; 999=/mnt/$1; shift; fi ;; --nn) shift; NONUM=" ! -name '*[0-9]*'"; ;; --nr) shift; NOREC="-maxdepth 1"; ;; -f|--fout) shift; if [ -n "$1" ]; then ERROR="| 2>filename | tee -a $1"; shift; fi ;; -s) shift; if [ -n "$1" ]; then echo "-e used: $1"; shift; fi ;; --) shift; break; ;; esac done #Geen map/opties opgegeven if [ $# -lt 1 ]; then fout; exit fi echo "Resterende argumenten: $@" >2; echo \# $# >2; #Arrays aanmaken met de bestandsnaam en map FILES=( $(find $@ $NOREC $NONUM -name \*.${EXT} $ERROR | rev | cut -d/ -f 1 | rev) ) FOLDERS=( $(find $@ $NOREC $NONUM -name \*.${EXT} $ERROR | rev | cut -d/ -f 1 --complement | rev) ) #Arrays in 2 kolommen weergeven for ((i = 0; i <= ${#FILES[@]}; i++)); do printf '%s %s\n' "${FILES[i]}" "${FOLDERS[i]}" done | column -t | sort -k1 #Kolommen duidelijker maken + Sorteren op bestandsnaam |
Alvast bedankt voor de hulp en tips die me op de goede weg zouden kunnen helpen!
🤞🏻