Zmień nazwy plików i nadaj uprawnienia do wykonywania skryptów Pythona

Spisie treści

W tym Samouczek Pythona zobaczmy skrypt, który będzie zmień wygląd pliku .txt na .sh w plikach, a także nada użytkownikowi uprawnienia do wykonywania. Do tego zadania wykorzystamy moduły, które już mamy w Pythonie, skrypt obowiązuje zarówno w wersji 2.X, jak i 3.X, chociaż dane wyjściowe są nieco inne, zachowanie się nie zmienia, jak zobaczymy później.

NotatkaZaimplementowany skrypt jest przeznaczony do użytku w systemach operacyjnych UNIX.

Na przykład utworzyłem folder z kilkoma plikami, niektóre mają rozszerzenie .txt, a inne nie, a jest też plik o nazwie test1.txt, który ma małe polecenie: ls-l. Ma to na celu sprawdzenie, czy jest faktycznie wykonywane, ponieważ reszta jest „lepka”, ponieważ nie zawiera danych. Zawartość folderu można zobaczyć na poniższym obrazku:

Jeśli zrobimy ls-l widzimy, że nikt nie ma uprawnień do wykonywania:

Teraz zobaczymy cały kod, który zostanie wyjaśniony poniżej.

 import os, sys, stat z podprocesu import Popen, PIPE if (len (sys.argv) <2): print ("Ścieżka do wyszukania jest wymagana") sys.exit (0) elif (nie os.path.exists ( sys.argv [1])): print ("Nie znaleziono:" + str (sys.argv [1])) sys.exit (0) process = Popen (["znajdź", sys.argv [1]] , stdout = PIPE, stderr = PIPE) jeśli nie process.stderr.read (): num = 0 dla linii w process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () jeśli (.txt" w lineNew i 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.S_IRGRP + stat.S_IXGRP) liczba + = 1 print („Praca wykonana, zmieniona”, liczba, „pliki”) else: print („Błąd”)
Zaczniemy od wyjaśnienia kodu krok po kroku, najpierw zaimportujemy potrzebne nam moduły.
 import os, sys, stat z podprocesu import Popen, PIPE
Następnie sprawdzimy, czy przekazano nam argument i czy jest to trasa, aby zobaczyć, czy kontynuujemy skrypt, czy nie.
 if (len (sys.argv) <2): print ("Ścieżka do wyszukania jest wymagana") sys.exit (0) elif (nie os.path.exists (sys.argv [1])): print ( " Nie znaleziono: "+ str (sys.argv [1])) sys.exit (0)
Aby kontynuować używamy Popen modułu podproces, przechwytujemy standardowe wyjście i wyjście błędów, robimy to za pomocą RURA, Rura. Teraz możemy czytać z potoku tak, jakby był to plik.
 process = Popen (["znajdź", sys.argv [1]], stdout = RURA, stderr = RURA)
Aby wiedzieć, czy kontynuować, sprawdzamy, czy wystąpił błąd (przechowywany w proces.stderr) o następującej treści, jeżeli:
 jeśli nie process.stderr.read ():
Jeśli wystąpi błąd, zostanie on wyświetlony na ekranie Błąd (dotyczy gałęzi else, która nie ma dalszych wyjaśnień) i program się zakończy. Jeśli nie, to co zrobimy to odczytanie ze standardowego potoku wyjściowego (stdout). Robimy to linia po linii z for, musimy zdekodować wyjście, w tym przypadku wybieram UTF-8, ponieważ przy ASCII dałoby to błędy na przykład z akcentami.

Jeśli dalej patrzymy na pętlę for, widzimy, że sprawdzamy, czy odczytana linia zawiera .txt, jeśli tak to sprawdza się również, czy jest to plik (nie jesteśmy zainteresowani zmianą folderu zawierającego .txt). Jeśli to prawda, używamy funkcji wymienić Pythona na zmianę .txt na .sh, a następnie za pomocą funkcji chmod modułu dajemy Ci uprawnienia, którymi będzie wykonanie, odczyt i zapis dla użytkownika, odczyt i wykonanie dla grupy i nic dla innych. Jak widać, korzystamy z modułu statystyk.

Zmienna num, którą zobaczysz w kodzie, służy po prostu do śledzenia liczby plików, które zmieniamy, a tym samym do wyświetlania informacji na ekranie.

 dla linii w process.stdout.readlines (): lineNew = line.decode ("UTF-8").strip () if (".txt" w lineNew i 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.S_IRGRP + stat.S_IXGRP) num + = 1
Na końcu pętli for pokazujemy informacje, o których mówimy, tutaj znajdziemy różnicę między wersją 2.xi 3.x, ponieważ przecinki przed i po num w wersji 2 to część na liście, a na 3 pokazuje normalne (bez listy).
 print ("Praca wykonana, zmieniona", num, "pliki")
Można to zmienić, aby interpretować to samo za pomocą + i przekształcenie zmiennej num na łańcuch za pomocą funkcji strlub przez %, poniżej znajdują się 2 kody:
 print ("Praca wykonana, zmieniona" + str (num) + "pliki") print ("Praca wykonana, zmieniona% d plików"% num)
Pozostawiono w pierwszy sposób pokazanie, że między wersjami Pythona zachodzą zmiany (mogą być małe jak w tym przypadku, ale coś, co działa w wersji 3, może nie działać w wersji 2 i odwrotnie).

Teraz i prawie do końca samouczka zamierzamy wykonać kod i zobaczyć, jak to działa, poniżej zostawiam 2 obrazy wykonania, używając Pythona 3.x w pierwszym, a w drugim Python 2.x:

Tutaj doceniamy drobne różnice. Teraz zobaczymy, jak wygląda folder testowy, który widzieliśmy wcześniej:

4 pliki, które miały .txt zostały zmienione i teraz mają .sh, wydaje się, że tylko plik test1.sh jest wykonywalny, ponieważ reszta nie zawiera danych. Uruchomimy plik test1.sh, który uruchomi tylko ls-l o których powiedzieliśmy, że zawiera, więc pomaga nam zobaczyć uprawnienia.

Samouczek kończy się tutaj, w przypadku zainteresowania, link do kolejny samouczek na temat Pythona: szukaj według nazwy pliku.

Podobał Ci się i pomógł ten samouczek?Możesz nagrodzić autora, naciskając ten przycisk, aby dać mu pozytywny punkt
wave wave wave wave wave