制作一个文件搜索程序,它接受带有 sys.argv 的单个正则表达式。

Make a file searching program that accepts a single regular expression with sys.argv.

我需要制作一个完全符合标题所述的程序。我需要我的程序搜索所有当前文件和所有子目录以查看是否有任何文件与模式匹配。如果有任何文件匹配该模式,则该文件的完整路径名应打印在屏幕上。

我已经完成了其中的一些,但是有些部分可能没有意义,因为我从 class 中给我的示例中复制并粘贴了一些部分:

#!/usr/bin/env python

import re, glob, sys, os
if (len(sys.argv) < 2):
        print("You need an argument.")
        sys.exit(0)

var = sys.argv(1)

#re.search(var,

data = os.walk(".")
for tup in data:
        dirname = tup[0]
        dirlist = tup[1]
        dirlist = tup[2]

        for file in filelist:
                fullname = os.path.join(dirname, file)
                username = owner(fullname)
                if re.data:
                print(os.path.abspath(os.path.join(username, fullname)))

基本上,当我运行 Linux 中的程序时,我需要键入程序的名称,然后是一个参数。该参数是我要搜索的文件的名称。因此,如果我输入“./lab7.py .txt”,我应该期望程序能够 return 任何 .txt 文件。我仍然是初学者,答案对你们中的一些人来说似乎很明显,但我似乎无法完成使该程序 运行 成为其应有方式所需的最后一步。感谢任何帮助,谢谢。

你的 .txt 论点 不是 意思是一个正则表达式,而是一个简单的扩展,所以你不需要正则表达式包。

这是我的版本。因为它可以是扩展名,也可以是文件名的一部分,所以只需使用 in。我还简化了没有意义的 owner() 部分(除了你的代码很接近)

import os,sys

if (len(sys.argv) < 2):
        print("You need an argument.")
        sys.exit(0)

var = sys.argv[1]

for root,dirs,files in os.walk("."):
    for f in files:
        if var in f:
            fullname = os.path.join(root, f)
            print(os.path.abspath(fullname))

如果扩展名匹配,则打印完整的文件路径。也适用于子目录。

此答案显示了基于模块 cli 的方法的高级草图,用于创建可重用的实用程序。

例如my_find . | my_grep 'txt'.

Python setup.py develop vs install

mkdir -p Homework/my_homework
touch Homework/setup.py
touch Homework/my_homework/assignment1.py

virtualenv venv_homework
source venv_homework/bin/activate
python setup.py develop
my_find . | my_grep 'txt'

setup.py:

from setuptools import setup, find_packages


setup(name='my_homework',
      install_requires=[
          # e.g. 'gevent>=0.0.0',
      ],
      entry_points={
          "console_scripts": [
              "my_find=my_homework.assignment1:list_directories",
              "my_grep=my_homework.assignment1:search_a_string",
          ]
      },
      include_package_data=True,
      packages=find_packages(),
      package_data={
           # config files
      },
      zip_safe=False)

Homework/my_homework/assignment1.py:

import fileinput
import argparse
import os, sys

def list_directories():
    # 
   sys.stdout.write('/some/directory/with/a/file.txt\n')
   sys.stdout.write('/some/directory/without/a/file\n') 


def search_a_string():
    '''
        reads from stdout and gets a regex from from sys.argv via argparse
        returns any found regexes back to stdout     
    '''
    # extra credit rewrite ArgumentParser using sys.argv
    argparser = argparse.ArgumentParser()
    argparser.add_argument('my_grep_args', metavar='MY_GREP_ARGS', nargs='*')
    print(my_grep_args)
    for line in fileinput.input():
        # 
        sys.stdout.write('regex found {}\n'.format(line))

有一些神奇之处,但基本上 setup.py 通过 setuptoolspython setup.py develop 会将函数 my_findmy_grep 放入 $PATH 类似于调用 python -m 'my_homework.assignment1.list_directories' . | python -m 'my_homework.assignment1.search_a_string' 'txt'

相关:

  • How to symlink a file in Linux?