实验五 Shell程序设计

更新时间:2024-05-28 20:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验五 Shell程序设计

1. 编写一个Shell程序findit,该程序搜索参数1指定的目录树,查找所有的以.c和.h结尾

的文件,如文件行中含有参数指定的字符串,显示该行和相应的文件名。如目录参数1缺省,则从当前目录中搜索。如:findit /home/wang/work searchstring

搜索以/home/wang/work为根的目录树中的c程序和头文件,查找含有searchstring字符串的行,显示文件名。 findit searchstring 从当前目录开始搜索。

2. 编一Shell程序,以类似书本的目录结构的形式,按层次输出当前目录树中的所有目录

和文件,要求每一层缩进4个空格。

/* sockcom.h */ #include #include #include #include #include #include #include #include

#define BUFSIZE 1024 #define PORT 3333

typedef struct fileinfo { char fname[50]; long length;

}FILEINFO, *Pfileinfo; /*

* SocketServer.c * */

#include \

int initSocket() { int sockfd, length; struct sockaddr_in server; char buf[BUFSIZE];

sockfd=socket(AF_INET, SOCK_STREAM,0);

if (sockfd<0) error(\ server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(PORT); if (bind(sockfd,(struct sockaddr *)&server, sizeof(server))<0) error(\ length=sizeof(server); if (getsockname(sockfd, (struct sockaddr *)&server, &length)<0) printf(\

printf(\ listen(sockfd, 5); return sockfd; }

int main(int argc, char *argv[]) { int sockfd, newsockfd, length, n; char buf[BUFSIZE]; sockfd = initSocket();

while(1) { newsockfd = accept(sockfd, (struct sockaddr *)0, (int *)0); int pid; if ((pid=fork())>0) { close(sockfd); bzero(buf, sizeof(buf)); FILEINFO fileinfo; bzero(fileinfo.fname, sizeof(fileinfo.fname)); if ((n = read(newsockfd, &fileinfo, sizeof(fileinfo)))<0) error(\

printf(\length: %d\\n\ int fd=creat(fileinfo.fname, 0644); long received=0; while((n=read(newsockfd, buf, BUFSIZE))>0) { write(fd, buf, n); received+=n; if (received==fileinfo.length) {

break;

fileinfo.fname); }

}

}

close(fd);

printf(\

exit(0); }

close(newsockfd);

return 0; }

#include #include

void error(char *msg) { printf(\ exit(1); }

#include \

int initSocket(char *rhost) { int sockfd; struct sockaddr_in server; struct hostent *hp, *gethostbyname(); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd<0) error(\ if ((hp=gethostbyname(rhost))==NULL) error(\rhost); server.sin_family = AF_INET; bcopy((char *)hp->h_addr, (char *)&server.sin_addr.s_addr, hp->h_length); server.sin_port=htons(PORT); if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))<0) error(\ return sockfd;

}

int main(int argc, char *argv[]) { if (argc!=4) { error(\ } printf(\ int n; char buf[BUFSIZE]; char *filename = argv[1]; FILEINFO fileinfo; strcpy(fileinfo.fname, argv[3]); int fd = open(filename, O_RDONLY); fileinfo.length = lseek(fd,0L,SEEK_END); printf(\ int sockfd=initSocket(argv[2]); if(write(sockfd, &fileinfo, sizeof(fileinfo))<0) error(\metadata.\ lseek(fd, 0L, SEEK_SET); }

第二种情况:

第一种情况是两层次的目录是父子关系,因此可以上面的方法实现。若两个层次上的目录并不是直接的父子关系,这时候在用上面的方法显然不合适。这里采用更加简洁的方法,第一种情况亦可以用。

#!/bin/bash

for dir in `find . -name clean.sh` do

path=`dirname $dir` if [ $path != . ]

while((n=read(fd, buf, BUFSIZE))>0) { write(sockfd, buf, n); }

close(fd);

printf(\close(sockfd); return 0;

then echo $path cd $path . clean.sh cd - fi

#! /bin/bash

#将自变量形式给出的目录下的全部普通文件名和权限列出

k=`echo $1|sed 's/\\/$//'`

for i in $k/* do

if [ -f \ then

j=`ls -l \ echo -e \ fi done

本文来源:https://www.bwwdw.com/article/yo37.html

Top