0.3 Python 实现 Linux 功能——ls 篇

整理

这次主要解决的是获取多个参数的问题。下面是我之前获取参数的代码
思路是将选项参数和路径参数分别放到两个列表中

def get_arg(cmd):
    arg_ls = []
        
    cmd_arg_ls = cmd.split(' ')[1:]
    cmd_arg_ls.append('')
    for arg in cmd_arg_ls:
        if arg.startswith('-'):
            arg_ls.append(arg)
            cmd_arg_ls.remove(arg)
    return arg_ls, cmd_arg_ls[0]

描述问题:选项参数为一个时,运行没有问题。当选项参数增加到两个时,运行结果就出现了问题,选项参数少了一个。
解决过程:将上述代码取出,做了一个简单的实验

list1 =['a','b','-a','-b']
arg=[]
for i in list1:
    if i.startswith('-'):
	    arg.apprnd(i)
		list1.remove(i)
print(list1)
print(arg)

输出为

['a', 'b', '-b']
['-a']

发现字符串'-b'没有取出来。为了弄清楚原因,我将四个字符串改成都以'-'开头

list1 =['-a','-b','-c','-d']
arg=[]
for i in list1:
    if i.startswith('-'):
        arg.append(i)
        list1.remove(i)
print(arg)

运行结果

['-a', '-c']

可以看到是隔一个取值的。通过打印遍历的i的取值,发现只取了字符串'-a', '-c'。猜想遍历列表是通过遍历列表的下标实现的
验证代码

list1 =['-a','-b','-c','-d']
arg=[]
for i, j in enumerate(list1):
    print('index:', i)
    print('vlaue:', j)
    if j.startswith('-'):
        arg.append(j)
        list1.remove(j)

实验结果

index: 0
vlaue: -a
index: 1
vlaue: -c

所以解决方法就是在列表移除一个元素时在补充回来。相关代码如下:

def get_arg(cmd:str) -> str:
    ...
    for arg in cmd_arg_ls:
        if arg.startswith('-'):
            ...
            cmd_arg_ls.insert(0,"")
    return arg_ls, cmd_arg_ls[-2]

改完之后,发现不带参数不能执行。经过分析发现是列表 'cmd_arg_ls' 索引返回的值出现了问题,原先列表‘cmd_arg_ls’中本身有一个空字符串,代表路径参数为空的情况。现在改变了索引后,如果不给其参数,列表中只会有一个元素。我的解决思路是把有参数和没有参数的分开,把重心放在有参数时的代码部分。
接下来是要解决如何识别多个参数的问题了。原先的方法是把用户输入参数以及参数的排列顺序都列出来,而这种方法的缺点是一旦参数过多,就会有很多种排列可能。之后有想到对输入的参数进行排序处理,这样就解决了需要排列组合的问题

main

import os
from cd import cd, path
from ls import *

while True:
    cmd = input("$ ")

    if 'cd' in cmd:
        cmd_c0 = cmd.strip('cd ')
        path = cd(cmd_c0)
    elif cmd == "ls":
        ls()
        continue

    if cmd.startswith('ls'):
        args, cmd_path = get_arg(cmd)
        arg_len = len(args)
        if cmd_path == '':
            ls_path = path
        else:
            ls_path = cmd_path

        if arg_len == 1:
            if '-d' in args:
                d_(ls_path)
            elif '-l' in args:
                l_(ls_path)
            elif '-a' in args:
                a_(ls_path)
            elif '-1' in args:
                obo(ls_path)
            elif '-r' in args:
                r_(ls_path)

        elif arg_len > 1:
            if args == ['--author', '-l']:
                author(ls_path)
            if args == ['-S', '-l']:
                S_(ls_path)
            if args == ['-a', '-l']:
                la_(ls_path)
            if args == ["-X", "-l"]:
                X_(ls_path)
            if args == ['-l', '-t']:
                lt_(ls_path)

        else:
            ls(ls_path)

ls

import os
from cd import path


def ls(path = ""):
    return os.system(f"dir /w {path}")


def get_arg(cmd:str) -> str:
    arg_ls = []
    cmd_arg_ls = cmd.split(' ')[1:]
    # cmd_arg_ls.append('')
    for arg in cmd_arg_ls:
        if arg.startswith('-'):
            arg_ls.append(arg)
            cmd_arg_ls.remove(arg)
            cmd_arg_ls.insert(0,"")

    # print(2, cmd_arg_ls)
    arg_ls = sorted(arg_ls)
    return arg_ls, cmd_arg_ls[-1]


def d_(path:str):
    dir_path = os.path.dirname(path)
    dir_name = dir_path.split('\\')[-1]
    # print(dir_path)
    print(dir_name)
    # return dir_name


def l_(path):
    return os.system(f'powershell dir {path}')


def a_(path):
    return os.system(f'dir /a/w {path}')


def r_(path):
    return os.system(f'dir /w /o:-n {path}')


def author(path):
    return os.system(f'dir /q {path}')


def S_(path):
    return os.system(f'dir /o:s {path}')


def X_(path):
    return os.system(f'dir /o:e {path}')

def lt_(path):
    return os.system(f'dir /t:w /o:-d')


def la_(path):
    return os.system(f'dir /a {path}')


def obo(path):
    return os.system(f'dir /b/o')
用以致学

留下你的脚步
推荐阅读