#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char** argv)
{
struct dirent *dp;
DIR *dfd;
char *dir ;
dir = argv[1] ;
if ( argc == 1 )
{
printf("Usage: %s dirname\n",argv[0]);
return 0;
}
if ((dfd = opendir(dir)) == NULL)
{
fprintf(stderr, "Can't open %s\n", dir);
return 0;
}
char filename_qfd[100] ;
char new_name_qfd[100] ;
while ((dp = readdir(dfd)) != NULL)
{
struct stat stbuf ;
sprintf( filename_qfd , "%s/%s",dir,dp->d_name) ;
if( stat(filename_qfd,&stbuf ) == -1 )
{
printf("Unable to stat file: %s\n",filename_qfd) ;
continue ;
}
if ( ( stbuf.st_mode & S_IFMT ) == S_IFDIR )
{
continue;
// Skip directories
}
else
{
char* new_name = get_new_name( dp->d_name ) ;// returns the new string
// after removing reqd part
sprintf(new_name_qfd,"%s/%s",dir,new_name) ;
rename( filename_qfd , new_name_qfd ) ;
}
}
}
尽管我个人更喜欢这样的剧本
#!/bin/bash -f
dir=$1
for file in `ls $dir`
do
if [ -f $dir/$file ];then
new_name=`echo "$file" | sed s:to_change::g`
mv $dir/$file $dir/$new_name
fi
done
7条答案
按热度按时间kzipqqlq1#
尽管我个人更喜欢这样的剧本
kcugc4gi2#
您可以使用
FTS(3)
循环浏览文件夹中的所有文件,使用C:http://keramida.wordpress.com/2009/07/05/fts3-or-avoiding-to-reinvent-the-wheel/
epggiuax3#
看一下dirent.h。
mwg9r5ms4#
关键函数是_findfirst、_findnext和_findclose
e0uiprwp5#
我知道这个答案会让我被否决,但是你的问题对于shell脚本(或.cmd脚本)、PHP脚本或Perl脚本来说是完美的,用C做这个问题比这个问题所需要的工作要多。
vbopmzt16#
fts
有一个很好的接口,但是它是4.4BSD,而且不可移植。(我最近被一些固有地依赖于fts的软件咬了一口。)opendir
和readdir
没有那么有趣,但是它们是POSIX标准,并且是可移植的。ifmq2ha27#
在终端中运行可执行文件的示例: