linux C 中的文件夹遍历dirent d_type表明该文件的类型 跪求~~~

linux C 中的文件夹遍历dirent d_type表明该文件的类型 跪求~~~,第1张

enum{DT_UNKNOWN = 0,# define DT_UNKNOWN DT_UNKNOWNDT_FIFO = 1,# define DT_FIFO DT_FIFODT_CHR = 2,# define DT_CHR DT_CHRDT_DIR = 4,# define DT_DIR DT_DIRDT_BLK = 6,# define DT_BLK DT_BLKDT_REG = 8,# define DT_REG DT_REGDT_LNK = 10,# define DT_LNK DT_LNKDT_SOCK = 12,# define DT_SOCK DT_SOCKDT_WHT = 14# define DT_WHT DT_WHT}这是d_type的枚举类型..........每个值表示一个类型..........4是目录,0是未知,1是管道,2是字符设备,8表示文件...............6是块设备..........其他的都如字面表示..........很容易区分.........

先设定实验环境:

#

5

目录,每个目录下,造

3

文件和两个子目录如下:

cd

$home/tmp

for

i

in

d1

d2

d3

d4

d5

do

mkdir

-p

$i

touch

$i/1.txt

$i/2.txt

$i/3.txt

mkdir

-p

$i/tmp1

$i/tmp2

done

#

检验测试环境:

$

ls

-lr

d1

total

0

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

1.txt

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

2.txt

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

3.txt

drwxr-sr-x

2

wenlee

comm

256

dec

22

10:35

tmp1/

drwxr-sr-x

2

wenlee

comm

256

dec

22

10:35

tmp2/

#

利用下列脚本来实现你要做的:

cd

$home/tmp

for

i

in

*/1.txt

do

echo

"found

$i,

save

$i

and

remove

everything

else

under

$(dirname

$i)/"

save_this_file=$(basename

$i)

curr_dir=$(dirname

$i)

#

把这个1.txt暂时存到/tmp里面去,为了避免已经有同样的档案名称在/tmp,加上$$

(i.e.

pid)

mv

$i

/tmp/${save_this_file}.$$

rm

-rf

$curr_dir

mkdir

-p

$curr_dir

mv

/tmp/${save_this_file}.$$

$curr_dir

done

#

屏幕执行输出如下:

found

d1/1.txt,

save

d1/1.txt

and

remove

everything

else

under

d1/

found

d2/1.txt,

save

d2/1.txt

and

remove

everything

else

under

d2/

found

d3/1.txt,

save

d3/1.txt

and

remove

everything

else

under

d3/

found

d4/1.txt,

save

d4/1.txt

and

remove

everything

else

under

d4/

found

d5/1.txt,

save

d5/1.txt

and

remove

everything

else

under

d5/

#

复验实验环境:

$

ls

-l

d?/*

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

d1/1.txt

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

d2/1.txt

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

d3/1.txt

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

d4/1.txt

-rw-r--r--

1

wenlee

comm

0

dec

22

10:35

d5/1.txt

ok?

thanks!

因为为了让程序变得准确可行。

1、chdir("..")是为了在递归完某一子目录后,退回到其父目录继续遍历后续的普通文件或其他子目录;如果缺少这一语句,那么while循环中的递归printdir将会把父目录中后续的普通文件当作目录来 *** 作,从而造成“无法打开目录”这种错误。

2、chdir(dir)是为了在程序刚运行时进入指定的目录,以及接下来递归时进入相应子目录;

用`pwd`提取的绝对路径。

[gag@genomic-server tmp]$ more test1

#!/usr/bin/perl -w

# script name is test

use strict

my $d="/home/gag"

my $now=`pwd`

print $now,"\n"

chdir $d

print `pwd`print `ls`

`touch iamhere`

print "#######################\n"

chdir $nowprint `pwd`

`touch iamherethen`

[gag@genomic-server tmp]$ perl test1

/home/gag/perl/tmp

/home/gag

c

cpp1

cpp2

java

perl

shell

tools

#######################

/home/gag

[gag@genomic-server tmp]$ ls

test1

[gag@genomic-server tmp]$ ls ../../

c cpp1 cpp2 iamhere iamherethen java perl shell tools


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/6171876.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-17
下一篇2023-03-17

发表评论

登录后才能评论

评论列表(0条)

    保存