需求:
某文件系统目录下有一系列文件:
quickshort.c
graph.py
heap.java
install.sh
stack.cpp
...
编写程序给其中的所有.py和.sh结尾的文件加上用户可执行权限
思路:
使用str.startswith()和str.endswith()方法
(注意多个匹配时,参数使用元组)
代码:
>>> fn = 'aaa.py'
>>> fn.endswith('.py')
True
>>> fn.endswith('.c')
False
>>> fn.endswith(('.py','.sh'))
True
>>> ls
a.c b.py c.java d.sh e.cpp h.asm
>>> os.listdir('.')
['d.sh', 'c.java', 'e.cpp', 'h.asm', 'b.py', 'a.c']
>>> d = os.listdir('.')
>>> os.stat('b.py')
os.stat_result(st_mode=33188, st_ino=536578, st_dev=66312, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604280862, st_mtime=1604280862, st_ctime=1604280862)
>>> s = os.stat('b.py')
>>> s
os.stat_result(st_mode=33188, st_ino=536578, st_dev=66312, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604280862, st_mtime=1604280862, st_ctime=1604280862)
>>> s.st_mode
33188
>>> ls -l b.py
-rw-r--r-- 1 richardo richardo 0 11月 2 09:34 b.py
>>> oct(s.st_mode)
'0o100644'
>>> s.st_mode | 0o100
33252
>>> oct(s.st_mode | 0o100)
'0o100744'
>>> oct(0o100)
'0o100'
>>> oct(0o100644 | 0o100)
'0o100744'
>>> 0o100644 | 0o100
33252
>>> oct(s.st_mode | s.st_mode)
'0o100644'
>>> s.st_mode
33188
>>> s
os.stat_result(st_mode=33188, st_ino=536578, st_dev=66312, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604280862, st_mtime=1604280862, st_ctime=1604280862)
>>> os.chmod('b.py',s.st_mode | 0o100)
>>> ll
总用量 0
-rw-r--r-- 1 richardo 0 11月 2 09:34 a.c
-rwxr--r-- 1 richardo 0 11月 2 09:34 b.py*
-rw-r--r-- 1 richardo 0 11月 2 09:34 c.java
-rw-r--r-- 1 richardo 0 11月 2 09:34 d.sh
-rw-r--r-- 1 richardo 0 11月 2 09:34 e.cpp
-rw-r--r-- 1 richardo 0 11月 2 09:34 h.asm
>>> import stat
>>> stat.S_IXUSR
64
>>> for fn in os.listdir():
... if fn.endswith(('.py','.sh')):
... fs = os.stat(fn)
... os.chmod(fn,fs.st_mode | stat.S_IXUSR)
...
>>> ll
总用量 0
-rw-r--r-- 1 richardo 0 11月 2 09:34 a.c
-rwxr--r-- 1 richardo 0 11月 2 09:34 b.py*
-rw-r--r-- 1 richardo 0 11月 2 09:34 c.java
-rwxr--r-- 1 richardo 0 11月 2 09:34 d.sh*
-rw-r--r-- 1 richardo 0 11月 2 09:34 e.cpp
-rw-r--r-- 1 richardo 0 11月 2 09:34 h.asm