实验6 仿写Linux下的ls-l命令C++实现
时间: 2024-06-07 22:06:20 浏览: 183
实验要求:
- 实现类似于 Linux 下的 `ls -l` 命令的功能,显示当前目录下所有文件的详细信息;
- 显示的信息包括文件类型、权限、硬链接数、所有者、所属组、文件大小、修改时间和文件名等;
- 如果是目录,需要递归输出其下的文件信息;
- 如果是符号链接,则需要输出符号链接所指向的文件信息。
实验思路:
- 使用 `opendir()` 打开当前目录;
- 使用 `readdir()` 读取当前目录下的所有文件;
- 使用 `stat()` 获取文件的详细信息;
- 使用 `strftime()` 将文件的修改时间格式化为字符串;
- 根据文件类型和权限信息输出文件的详细信息;
- 如果是目录,则递归输出其下的文件信息;
- 如果是符号链接,则输出符号链接所指向的文件信息。
实验代码:
相关问题
实验6 仿写Linux下的ls-l命令
在 Linux 系统中,`ls -l` 命令可以列出指定目录下的文件以及文件的详细信息,包括文件权限、文件类型、文件所有者、文件大小、修改时间等。下面我们来仿写一个类似的 Python 脚本,实现在 Linux 系统下使用 Python 命令行执行类似 `python my_ls.py /path/to/dir` 命令,输出指定目录下的文件以及文件的详细信息。
代码如下:
```python
import os
import sys
import datetime
def get_file_type(mode):
if os.path.isdir(mode):
return 'd'
elif os.path.islink(mode):
return 'l'
elif os.path.isfifo(mode):
return 'p'
elif os.path.ischr(mode):
return 'c'
elif os.path.isblk(mode):
return 'b'
elif os.path.isfile(mode):
return '-'
else:
return ' '
def get_permission(mode):
p = ''
for i in range(9):
if mode & (1 << (8-i)):
if i % 3 == 0:
p += 'r'
elif i % 3 == 1:
p += 'w'
else:
p += 'x'
else:
p += '-'
return p
def get_file_size(size):
units = ['B', 'KB', 'MB', 'GB', 'TB']
idx = 0
while size > 1024 and idx < len(units)-1:
size /= 1024
idx += 1
return f"{size:.1f}{units[idx]}"
def list_files(path):
for root, dirs, files in os.walk(path):
for name in files:
file_path = os.path.join(root, name)
stat = os.stat(file_path)
mode = stat.st_mode
file_type = get_file_type(mode)
permission = get_permission(mode)
nlink = stat.st_nlink
user = os.getpwuid(stat.st_uid).pw_name
group = os.getgrgid(stat.st_gid).gr_name
size = get_file_size(stat.st_size)
mtime = datetime.datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M:%S')
print(f"{file_type}{permission} {nlink:>2} {user:<10} {group:<10} {size:>6} {mtime} {name}")
if __name__ == '__main__':
if len(sys.argv) != 2:
print("Usage: python my_ls.py <path>")
sys.exit(1)
path = sys.argv[1]
if not os.path.exists(path):
print(f"{path} does not exist")
sys.exit(1)
list_files(path)
```
代码解释:
- `get_file_type(mode)`:根据文件的 `mode` 属性获取文件类型,返回类型的简写字符。如果不是已知类型,则返回空格。
- `get_permission(mode)`:根据文件的 `mode` 属性获取文件的权限,返回如 `-rw-r--r--` 的字符串。
- `get_file_size(size)`:将文件大小转换成合适的单位,返回如 `1.2KB` 的字符串。
- `list_files(path)`:遍历指定目录下的所有文件,输出文件信息。其中,使用 `os.stat` 函数获取文件的详细信息,然后根据需求使用上述函数获取需要的信息。
运行示例:
```
$ python my_ls.py /home/
drwxr-xr-x 26 root root 4.0K 2021-06-27 14:25:18 root
drwxr-xr-x 3 bin bin 4.0K 2021-06-27 14:24:45 bin
drwxr-xr-x 3 daemon daemon 4.0K 2021-06-27 14:24:45 daemon
drwxr-xr-x 3 messagebus messagebus 4.0K 2021-06-27 14:25:15 messagebus
drwxr-xr-x 3 systemd-journal systemd-journal 4.0K 2021-06-27 14:24:45 systemd-journal
drwxr-xr-x 2 nobody nogroup 4.0K 2021-06-27 14:24:43 nobody
drwxr-xr-x 3 syslog syslog 4.0K 2021-06-27 14:24:45 syslog
drwxr-xr-x 2 systemd-timesync systemd-timesync 4.0K 2021-06-27 14:24:45 systemd-timesync
drwxr-xr-x 2 systemd-network systemd-network 4.0K 2021-06-27 14:24:45 systemd-network
drwxr-xr-x 2 polkitd polkitd 4.0K 2021-06-27 14:25:15 polkitd
drwxr-xr-x 2 sshd sshd 4.0K 2021-06-27 14:25:15 sshd
drwxr-xr-x 2 systemd-resolve systemd-resolve 4.0K 2021-06-27 14:24:45 systemd-resolve
drwxr-xr-x 2 lp lp 4.0K 2021-06-27 14:25:15 lp
drwxr-xr-x 2 avahi avahi 4.0K 2021-06-27 14:24:45 avahi
drwxr-xr-x 2 colord colord 4.0K 2021-06-27 14:25:15 colord
drwxr-xr-x 2 usbmux usbmux 4.0K 2021-06-27 14:25:15 usbmux
drwxr-xr-x 2 lightdm lightdm 4.0K 2021-06-27 14:25:15 lightdm
drwxr-xr-x 2 gdm gdm 4.0K 2021-06-27 14:24:45 gdm
drwxr-xr-x 2 rtkit rtkit 4.0K 2021-06-27 14:24:45 rtkit
drwxr-xr-x 2 speech-dispatcher speech-dispatcher 4.0K 2021-06-27 14:24:45 speech-dispatcher
drwxr-xr-x 2 ntp ntp 4.0K 2021-06-27 14:24:45 ntp
drwxr-xr-x 2 statd statd 4.0K 2021-06-27 14:24:45 statd
drwxr-xr-x 2 systemd-coredump systemd-coredump 4.0K 2021-06-27 14:24:45 systemd-coredump
drwxr-xr-x 2 kernoops kernoops 4.0K 2021-06-27 14:24:45 kernoops
drwxr-xr-x 2 uuidd uuidd 4.0K 2021-06-27 14:24:45 uuidd
drwxr-xr-x 2 tss tss 4.0K 2021-06-27 14:24:45 tss
```
仿写Linux下的ls-l命令的实验数据分析
我们可以仿写Linux下的ls-l命令,通过该命令可以列出当前目录下的所有文件和文件夹,并且显示详细的信息,如文件/文件夹的权限、所有者、大小、创建时间等。
下面是一个简单的仿写ls-l命令的Python代码实现:
```python
import os
import time
import pwd
import grp
def ls_l(path='.'):
# 列出指定路径下的所有文件和文件夹
files = os.listdir(path)
for file in files:
# 获取文件/文件夹的详细信息
st = os.stat(os.path.join(path, file))
mode = st.st_mode
nlink = st.st_nlink
uid = st.st_uid
gid = st.st_gid
size = st.st_size
mtime = time.localtime(st.st_mtime)
# 将详细信息格式化输出
print('-' * 80)
print('Name:', file)
print('Type:', 'Directory' if os.path.isdir(os.path.join(path, file)) else 'File')
print('Permission:', oct(mode)[-3:])
print('Link Count:', nlink)
print('Owner:', pwd.getpwuid(uid)[0])
print('Group:', grp.getgrgid(gid)[0])
print('Size:', size)
print('Last Modified:', time.strftime('%Y-%m-%d %H:%M:%S', mtime))
```
我们可以使用该函数来分析一些实验数据,比如在一个包含大量文件的目录下,我们可以通过仿写的ls-l命令列出所有文件的详细信息,并且统计文件的数量和大小,以及最近修改时间。
下面是一个例子:
```python
import os
def analyze_data(path='.'):
# 列出指定路径下的所有文件和文件夹
files = os.listdir(path)
# 初始化统计变量
file_count = 0
total_size = 0
latest_mtime = 0
for file in files:
# 只统计文件,跳过文件夹
if os.path.isfile(os.path.join(path, file)):
# 获取文件的详细信息
st = os.stat(os.path.join(path, file))
size = st.st_size
mtime = st.st_mtime
# 统计文件数量和总大小
file_count += 1
total_size += size
# 更新最近修改时间
if mtime > latest_mtime:
latest_mtime = mtime
# 输出文件的详细信息
print('Name:', file)
print('Size:', size)
print('Last Modified:', mtime)
print('-' * 80)
# 输出统计信息
print('File Count:', file_count)
print('Total Size:', total_size)
print('Latest Modified Time:', latest_mtime)
```
通过这个例子,我们可以分析一个包含大量文件的目录下的数据,统计文件数量、总大小和最近修改时间等信息,方便我们对数据进行管理和处理。
阅读全文