Pārdēvējiet failus un dodiet Python skripta izpildes atļauju

Satura rādītājs

Šajā Python apmācība redzēsim skriptu, kas būs mainīt .txt izskatu uz .sh failos, un tas arī sniegs izpildes atļaujas lietotājam. Šim uzdevumam mēs izmantosim moduļus, kas mums jau ir Python, skripts ir derīgs gan versijai 2.X, gan 3.X, lai gan izvade ir nedaudz atšķirīga, uzvedība nemainās, kā mēs redzēsim vēlāk.

PiezīmeRealizējamais skripts ir paredzēts lietošanai UNIX operētājsistēmās.

Piemēram, esmu izveidojis mapi ar vairākiem failiem, dažiem ir .txt paplašinājums, bet citiem nav, un ir arī fails ar nosaukumu test1.txt, kuram ir neliela komanda: ls -l. Tas ir, lai pārbaudītu, vai tas faktiski tiek izpildīts, jo pārējie ir “lipīgi”, jo tajos nav datu. Mapes saturu var redzēt šādā attēlā:

Ja mēs darām a ls -l mēs redzam, ka nevienam nav izpildes atļauju:

Tagad mēs redzēsim pilnu kodu, un tas tiks paskaidrots zemāk.

 importēt os, sys, stat no apakšprocesa importēt Popen, PIPE, ja (len (sys.argv) <2): print ("Nepieciešamais ceļš") sys.exit (0) elif (nav os.path.exists (sys.argv [1])):: print ("Nav atrasts:" + str (sys.argv [1])) sys.exit (0) process = Popen (["atrast", sys.argv [1]] , stdout = PIPE, stderr = PIPE) ja ne process.stderr.read (): num = 0 rindai procesā.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (".txt" in lineNew un os.path.isfile (lineNew)): new = lineNew.replace (". txt", ". sh") os.rename (lineNew, new) os.chmod (new, stat. S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.
Mēs sāksim ar koda skaidrojumu soli pa solim, pirmā lieta, ko mēs darām, ir importēt nepieciešamos moduļus.
 importēt os, sys, stat no apakšprocesa importa Popen, PIPE
Tad mēs pārbaudīsim, vai mums ir izturēts arguments un vai tas ir maršruts, lai redzētu, vai mēs turpinām skriptu vai nē.
 ja (len (sys.argv) <2): print ("Nepieciešams meklēšanas ceļš") sys.exit (0) elif (nevis os.path.exists (sys.argv [1]))): print ( "Nav atrasts:"+ str (sys.argv [1])) sys.exit (0)
Lai turpinātu, mēs izmantojam Popen no moduļa apakšprocess, mēs uztveram standarta izvadi un kļūdas izvadi, mēs to darām, izmantojot PIPE, Caurule. Tagad mēs varam nolasīt no cauruļvada tā, it kā tas būtu fails.
 process = Popen (["atrast", sys.argv [1]], stdout = PIPE, stderr = PIPE)
Lai uzzinātu, vai turpināt, mēs pārbaudām, vai nav radusies kļūda (saglabāta process.stderr) ar šādu, ja:
 ja ne process.stderr.read ():
Ja ir kļūda, tā tiks parādīta ekrānā Kļūda (tas attiecas uz filiāli else, kurai nav papildu paskaidrojumu) un programma beidzas. Ja nē, tas, ko mēs darīsim, tiks nolasīts no standarta izejas caurules (stdout). Mēs to darām rindu pa rindai ar for, mums ir jāatšifrē izeja, šajā gadījumā es izvēlos UTF-8, jo, izmantojot ASCII, tas, piemēram, radītu kļūdas ar akcentiem.

Ja mēs nepārtraukti skatāmies uz cilpu for, mēs redzam, ka mēs pārbaudām, vai izlasītā rindiņa satur .txt, ja tā, tad tiek pārbaudīts, vai tas ir fails (mēs neesam ieinteresēti mainīt mapi, kas satur .txt). Ja tā ir taisnība, mēs izmantojam funkciju aizvietot no Python, lai mainītu .txt uz .sh, un pēc tam ar moduļa chmod funkciju mēs jums piešķiram atļaujas, kas būs izpilde, lasīšana un rakstīšana lietotājam, lasīšana un izpilde grupai un nekas citiem. Kā redzat, mēs izmantojam stat moduli.

Mainīgo skaitu, ko jūs redzēsit kodā, vienkārši izmanto, lai izsekotu mainīto failu skaitam un tādējādi galu galā varētu parādīt informāciju ekrānā.

 rindai procesā.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (". txt" in lineNew and os.path.isfile (lineNew)): new = lineNew. aizstāt (". txt", ". sh") os.rename (lineNew, new) os.chmod (new, stat.S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1
Formas cikla beigās mēs parādām informāciju, par kuru mēs runājam. Šeit mēs atradīsim atšķirību starp versiju 2.x un 3.x, jo komati pirms un pēc numura 2. versijā sarakstā un 3, tas parāda normālu (bez saraksta).
 drukāt ("Paveikts, mainīts", numurs, "faili")
To var mainīt, lai to interpretētu tāpat, izmantojot + un mainīgā num pārveidošana par virkni ar funkciju str, vai caur %, zemāk ir 2 kodi:
 print ("Paveikts, mainīts" + str (num) + "faili") print ("Paveikts, paveikts% d fails"% num)
Tas tika atstāts pirmajā veidā, lai parādītu, ka starp Python versijām ir izmaiņas (tās var būt nelielas, kā šajā gadījumā, bet kaut kas, kas darbojas 3. versijā, var nedarboties 2. versijā, un otrādi).

Tagad un gandrīz, lai pabeigtu apmācību, mēs izpildīsim kodu un redzēsim, kā tas darbojas, zemāk es atstāju 2 izpildes attēlus, izmantojot Python 3.x pirmajā un otrajā Python 2.x:

Šeit mēs novērtējam nelielas atšķirības. Tagad mēs redzēsim, kā izskatās iepriekš redzētā testēšanas mape:

4 faili, kuriem bija .txt, ir mainīti, un tagad tiem ir .sh, šķiet, ka tikai test1.sh fails ir izpildāms, tas ir tāpēc, ka pārējie nesatur datus. Mēs izpildīsim failu test1.sh, kas sāks tikai ls -l mēs teicām, ka tas satur, un tāpēc tas palīdz mums redzēt atļaujas.

Apmācība beidzas šeit, ja tas interesē, saite uz vēl viena apmācība par Python: meklēt pēc faila nosaukuma.

Vai jums patika šī apmācība un palīdzējāt tai?Jūs varat apbalvot autoru, nospiežot šo pogu, lai sniegtu viņam pozitīvu punktu
wave wave wave wave wave