Kako narediti zanko nad datotekami v imeniku in spremeniti pot ter dodati končnico imenu datoteke
Napisati moram skripto, ki zažene moj program z različnimi argumenti, vendar sem novinec v Bashu. Svoj program začnem z:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
Tukaj je psevdokoda za to, kar želim narediti:
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
Tako da sem res zmeden, kako iz prvega argumenta ustvariti drugega, da bo videti kot dataABCD_Log1.txt, in zagnati svoj program.
511
3
Najprej nekaj pripomb: ko kot argument uporabite
Data/data1.txt
, bi to res moralo biti/Data/data1.txt
(z začetno poševnico)? Ali naj zunanja zanka išče samo datoteke .txt ali vse datoteke v /Data? Tukaj je odgovor, ki predvideva/Data/data1.txt
in samo datoteke .txt:Opravičujem se, da sem se vrnil na to temo, vendar je dobra praksa, da se izognete primeru, ko se globus ne ujema (zaradi česar se spremenljivka zanke razširi na sam niz globusa (ki se ne ujema)).
Na primer:
Referenca: Bash Pitfalls
Zamenjava
name=${file##*/}
(shell parameter expansion) odstrani začetno ime poti do zadnjega/
.Zamenjava
base=${name%.txt}
odstrani končni.txt
. Če se lahko razširitve razlikujejo, je to nekoliko bolj zapleteno.