Linux与C语言实现rm命令 (linux c语言实现rm)

在Linux系统中,rm命令是一个非常常用的命令,用于删除文件或目录。如果没有rm命令,那么Linux系统的使用会非常不方便。本文将介绍如何使用C语言来实现rm命令。

一、rm命令的使用

rm命令用于删除文件或目录。其基本语法如下:

rm [参数] 文件或目录

常用参数如下:

-r:递归删除目录及其子目录;

-f:强制删除,不提示用户确认。

实例:

rm filename1:删除文件filename1

rm –r dirname1:递归地删除目录dirname1及其所有子目录和文件

rm –f filename1:强制删除文件filename1,不需要确认

二、实现rm命令

使用C语言来实现rm命令需要使用到两个系统调用,即unlink()和rmdir()。unlink()函数用于删除一个文件,rmdir()函数用于删除一个空目录。

下面是C语言实现rm命令的流程:

1.获取命令行中的文件路径;

2.使用stat()函数获取文件的属性,并判断文件是否存在以及是否是目录;

3.如果是目录,则使用opendir()函数打开目录,并使用readdir()函数读取目录下的文件;

4.递归地删除目录下的所有文件和文件夹;

5.使用unlink()函数删除文件或rmdir()函数删除空目录。

下面是一个简单的C语言实现rm命令的代码:

“`

#include

#include

#include

#include

#include

#include

// 递归地删除目录及其子目录和文件

int rm_dir(const char *dir) {

DIR *dp;

struct dirent *entry;

struct stat statbuf;

if ((dp = opendir(dir)) == NULL) {

fprintf(stderr, “Cannot open directory: %s\n”, dir);

return -1;

}

chdir(dir);// 进入目录

while ((entry = readdir(dp)) != NULL) {

lstat(entry->d_name, &statbuf);// 获取文件信息

if (S_ISDIR(statbuf.st_mode)) {

if (strcmp(“.”, entry->d_name) == 0 || strcmp(“..”, entry->d_name) == 0) {

continue;

}

rm_dir(entry->d_name);// 递归删除子目录

} else {

unlink(entry->d_name);// 删除文件

}

}

closedir(dp);// 关闭目录

chdir(“..”);// 退出目录

rmdir(dir);// 删除空目录

return 0;

}

int mn(int argc, char *argv[]) {

int i, ret;

struct stat statbuf;

if (argc

printf(“usage: %s file1 file2 file3 …\n”, argv[0]);

exit(1);

}

for (i = 1; i

if (stat(argv[i], &statbuf)

fprintf(stderr, “Cannot open file: %s\n”, argv[i]);

continue;

}

if (S_ISDIR(statbuf.st_mode)) {

ret = rm_dir(argv[i]);

if (ret == -1) {

fprintf(stderr, “Cannot delete directory: %s\n”, argv[i]);

}

} else {

unlink(argv[i]);

}

}

return 0;

}

“`

三、

相关问题拓展阅读:

linux如何使用rm命令快速删除文件

rm命令用于删除文件。

命令格式:rm 文件名

常用选项:

-f, –force 强制删除。忽略不存在的文件,不提示确认

-i 在删除前需要确认

-r, -R, –recursive 递归删除目录及其内容

-v, –verbose 详细显示进行的步骤

默认时,rm 不会删除目录。使用–recursive(-r 或-R)选项可删除每个给定的目录,以及其下所有的内容。

用法示例:删除文件名为zhidao.txt的文件

$ rm zhidao.txt

rm -rf 直接删除文件、文件夹 按Tab键可以快速选择文件

加个参数

linux rm命令怎么用

Linux rm命令是用于删除一个文件或者目录的,操作演示:

1、打开linux命令行,在上面输入ls查看当前目录下存在的文件,如下图可以看到有一个1.txt

2、输入rm 1.txt就删除1.txt这个文件了

3、再次输入ls后发现已经看不到之前的1.txt了,说明已经删除了

[Linux]编写一个简单的C语言程序,编写Makefile文件。

八 环境变量

8.1 查看环境变量

$ env  显示所有的环境变量设置

$ echo $ENV_VARIABLE  显示指定环境变量的设置

例:

$ echo $PATH

/bin:/etc:/usr/bin:/tcb/bin

8.2 设定环境变量

$ ENV_VARIABLE=XXX;export ENV_VARIABLE

例:

$ PATH=$PATH:$INFORMIXDIR/bin;export PATH  将环境变量PATH设定为原PATH值+$INFORMIXDIR/bin

8.3 取消环境变量设置

$ unset $ENV_VARIABLE

例:

$ set GZJ=gzj;export GZJ  设置环境变量GZJ

$ echo $GZJ

gzj  显示环境变量值

$ unset $GZJ  取消环境变量GZJ的设置

$ echo $GZJ

 已取消

一 makefile规则

makefile是一个make的规则描述脚本文件,包括四种类型行:目标行、命令行、宏定义行和make伪指令行(如“include”)。makefile文件中注释以“#”开头。当一行写不下时,可以用续行符“\”转入下一行。

1.1 目标行

目标行告诉make建立什么。它由一个目标名表后面跟冒号“:”,再跟一个依赖性表组成。

例:

example: depfile deptarget

该目标行指出目标example与depfile和deptarget有依赖关系,如果depfile或deptarget有修改,则重新生成目标。

example1 example2 example3: deptarget1 deptarget2 depfile

该目标行指出目标名表中的example1、example2、example3这三个各自独立的目标是用相同的依赖列表和规则生颤激成的。

clean:

空的依赖列表说明目标clean没有其他依赖关系。

目标行后续的以Tab 开始的行是指出目标的生成规则,该Tab字符不能以空格代替。例如:

example.o:example.c example.h

cc –c example.c

该例子指出目标example.o依赖于example.c和example.h。如果example.c或example.h其中之一改变了,就需要执行命令cc –c example.c重新生成目标example.o。

可以用文件名模式匹配来自动为目标生成依赖表,如:

prog: *.c

以下是一个简单的makefile的例子:

图 1 最简单的makefile例

make使用makefile文件时,从之一个目标开始扫描。上例中的之一个目标为all,所以目标clean不会自动被行知执行,可以通过命令make clean来生成目标。

1.2 命令行

命令行用来定义生成目标的动作。

在目标行中分号“;”后面的文件都认为是一个命令,或者一行以Tab制表符开始的也是命令。

如在上面的makefile例中,第三行以Tab字符开始的cc命令即是一个命令行,说明要生成hello应执行的命令。也可以写成:hello:hello.o;cc –c hello –L…

一般情况下,命令行的命令会在标准输出中回显出来,如对上面的makefile执行make时,标准输出如下:

cc -c hello.c

cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o

cc -c hello1.c

cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o

如果不希望命令本身回显,可在命令前加@字符,如在上例中不希望回显cc –c hello.c和cc –c hello1.c,可修改makefile文件如下:

图 2 抑制回显的makefile例

对该makefile文件执行make时,标准输出如下:

cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o

cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o

可以看出,命令行前有@字符的不回显。

1.3 宏定义茄带袜行

在makefile中,可以使用宏定义减少用户的输入,例如上例中对hello和hello1的编译选项均为“-L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11”,此时可以用宏来代替,如:

图 3 使用宏定义的makefile例

宏定义的基本语法是:

name=value

在定义宏时,次序不重要。宏不需要在使用前定义。如果一个宏定义多次,则使用最后一次的定义值。

可以使用“$”字符和“()”或“{}”来引用宏,例如:

cc –o hello.o $(CCFLAGS) hello.o

也可以将一个宏赋值给另一个宏,但这样的定义不能循环嵌套,如:

A=value1

B=value2

C=$(A) $(B)等价于C=value1 value2

1.4 伪指令

makefile大部分由宏定义行、命令行和目标行组成。第四种类型是make伪指令行。make伪指令没有标准化,不同的make可能支持不同的伪指令集,使得makefile有一定的不兼容性。如果要考虑移植性问题,则要避免使用make伪指令。但有一些伪指令,如include,由于使用比较多,很多不同make都提供该伪指令。

1.4.1 伪指令include

该伪指令类似C语言中的#include,它允许一次编写常用的定义并包括它。include伪指令必须在一行中,之一个元素必须是include,并且跟一个要包含的文件名,如:

include default.mk

1.4.2 伪指令“#”

“#”字符也是make的伪指令,它指出“#”后面的文件是注释,如:

PROGNAME=test # define macro

#don’t modify this

二 后缀规则

2.1 双后缀规则

在前面的makefile例中有许多重复内容,例如,生成hello和hello1的命令类似,生成hello.o和hello1.o的命令也类似,除了编译或链接的文件不一样外,其它均相同,这时,我们就可以使用后缀规则。首先看一个双后缀的例子:

图 4 使用双后缀规则的makefile例

后缀规则使用特殊的目标名“.SUFFIXES”。

之一行中.SUFFIXES的依赖表为空,用来清除原有的后缀规则,因为.SUFFIXES可以在makefile中多次使用,每一次都将新的后缀规则加入以前的后缀规则中。

第二行中指定后缀规则为“.c .o”,即表示将所有的.c文件转换为.o文件。

第三行指定将.c文件转换成.o文件的方法。$(CC)为make的预定义宏,其默认值为cc,$

#include

MODULE_LICENSE(“Dual BSD/GPL”);

static int hello_init(void)

{

printk(KERN_ALERT “Hello, world\n”);

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT “Goodbye, cruel world\n”);

}

module_init(hello_init);

module_exit(hello_exit);

makefile:

# If KERNELRELEASE is defined, we’ve been invoked from the

# kernel build system and can use its language.

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

# Otherwise we were called directly from the command

# line; invoke the kernel build system.

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

这个已经通过调试了!

//calculate.h

#ifndef DEFCALCULATE_H

#define DEFCALCULATE_H

#include

#include

#include

#include

using namespace std;

// =========================================================================

// = 一些标志,如数字、+-*/()

enum Token_value

{

NAME,

NUMBER,

END,

PLUS=’+’,

MINUS=’-‘,

MUL=’*’,

DIV=’/’,

PRINT=’;’,

ASSIGN=’=’,

LP='(‘,

RP=’)’

};

//#############################################################################

//#############################################################################

double term(bool); //乘法

double prim(bool); //处理初等项

double error(const string&); //错误函数羡雀

Token_value get_token(); //输入

double expr(bool get); //加和减

//#############################################################################

//#############################################################################

extern double number_value; /宽歼/

extern string string_value; //

extern Token_value curr_tok; //当前操作标志

extern map table;//

extern int no_of_errors; //

#endif

//慎派冲winconsole.cpp

#include “calculate.h”

#include

istream* input;

int main()

{

//switch(argc)

//{

//case 1:

input=&cin;

// break;

//case 2:

// input=new istringstream(argv);

// break;

//default:

// error(“too many arguments”);

// return 1;

//}

table=3.14159;

table=2.718182;

while (*input)

{

get_token();

if (curr_tok==END)

{

break;

}

if (curr_tok==PRINT)

{

continue;

}

cout>ch;

switch(ch)

{

case 0:

return curr_tok=END;

case ‘;’:

case ‘*’:

case ‘/’:

case ‘+’:

case ‘-‘:

case ‘(‘:

case ‘)’:

case ‘=’:

return curr_tok=Token_value(ch);

case ‘0’:case ‘1’:case ‘2’:case ‘3’:case ‘4’:

case ‘5’:case ‘6’:case ‘7’:case ‘8’:case ‘9’:

case ‘.’:

cin.putback(ch);

cin>>number_value;

return curr_tok=NUMBER;

default:

if (isalpha(ch))

{

cin.putback(ch);

cin>>string_value;

return curr_tok=NAME;

}

error(“bad token”);

return curr_tok=PRINT;

}

}

//prim.cpp

#include “calculate.h”

double number_value;

string string_value;

map table;

double prim(bool get)

{

if (get)

{

get_token();

}

switch(curr_tok)

{

case NUMBER:

{

double v=number_value;

get_token();

return v;

}

case NAME:

{

double& v=table;

if (get_token()==ASSIGN)

{

v=expr(true);

}

return v;

}

case MINUS:

{

return -prim(true);

}

case LP:

{

double e=expr(true);

if (curr_tok!=RP)

{

return error(“)expected”);

}

get_token();

return e;

}

default:

return error(“primary expected”);

}

}

//term.cpp

#include “calculate.h”

double term(bool get)

{

double left=prim(get);

for (;;)

{

switch(curr_tok)

{

case MUL:

left*=prim(true);

break;

case DIV:

if (double d=prim(true))

{

left/=d;

break;

}

return error(“divide by 0”);

default:

return left;

}

}

}

//makefile

objects = error.o expr.o get_token.o prim.o term.o winconsole.o

calculate:$(objects)

g++ -Wall -g -o calculate $(objects)

$(objects) : %.o : %.cpp

g++ -c $(CXXFLAGS) $

关于linux c语言实现rm的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux与C语言实现rm命令 (linux c语言实现rm)