Avatar billede djones Nybegynder
04. juli 2003 - 14:53 Der er 15 kommentarer og
1 løsning

Linux: Hvordan lister jeg dirs og files?

Jeg vil lave en recursive renaming af alle filer under "mainfolder" incl. subdirs, men har problemer med at få scandir til at virke...
Hvordan virker scandir?
Desuden skal jeg kunne teste om det er en fil eller en dir jeg har fat i... EX udbedes
Avatar billede opperen Nybegynder
04. juli 2003 - 15:06 #1
Kan du ikke bare bruge perl?

>>perl -e '@arr = `ls`; while($f = pop @arr){$f = substr($f,0,-1);print $f . " er en fil\n" if -e $f;print $f . " er en mappe\n" if -d $f}'

I stedet for print halløjet kan du bare lave en `mv $f nytnavn`;
Avatar billede olennert Nybegynder
04. juli 2003 - 15:06 #2
Google siger http://www.lrz-muenchen.de/services/compute/linux-cluster/kernel/glibc-2.2.5/libc_14.html#SEC277

Bemærk, jeg har ikke selv prøvet det, har ikke adgang til min Linux-boks før en gang i aften.
Avatar billede opperen Nybegynder
04. juli 2003 - 15:08 #3
Du skal lige skrive `ls -R` hvis den skal løbe igennem undermapper
Avatar billede olennert Nybegynder
04. juli 2003 - 15:14 #4
Og hvis du (med et systemkald fra C++) skal checke om det er en fil, så bruger du stat:

struct stat statbuf;
if (stat(filename, &statbuf) == -1) {
  // Fejlhåndtering, stat fejlede
}
if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
  // Ikke en fil, gør et eller andet, evt. check om det er et dir
} else {
  // En fil, gør et eller andet med den
}

Se man stat for mere info.
Avatar billede arne_v Ekspert
04. juli 2003 - 15:33 #5
Jeg vil anbefale:
  opendir
  readdir
  closedir

Begrundelse: de finde på de fleste non-Windows systemer (mere præcist all
POSIX compliant systemer).


Brug:

#include <dirent.h>

DIR dirp = opendir(dirspec);

struct dirent *entp = readdir(dirp);

closedir(dirp);
Avatar billede arne_v Ekspert
04. juli 2003 - 15:37 #6
readdir returnerer NULL hvis der ikke er flere filer.

struct dirent har et felt d_name.
Avatar billede djones Nybegynder
04. juli 2003 - 15:50 #7
ok det skal måske lige nævnes at jeg er newbie og derfor ikke aner hvad struct er for en størrelse.

olennert >> hvor skal jeg indsætte "struct stat statbuf;" osv. ?


arne_v >> jeg vil gerne have en forklaring til hver linie, så jeg nogenlunde ved hvad de gør...
Avatar billede arne_v Ekspert
04. juli 2003 - 16:00 #8
En struct en en data struktur som indeholder flere variable.

Eksempel:

struct min_struktur
{
  int a;
  double b;
};

struct min_structur ms;
ms.a = 123;
ms.b = 123.456;
Avatar billede arne_v Ekspert
04. juli 2003 - 16:01 #9
opendir kalder man med directoriet man vil liste og får en pointer til
directoriet tilbage.

Så kalder man readdir indtil man får NULL tilbage og hver kald returnerer
en fil i directoriet.

closedir lukker og frigør data struktur.
Avatar billede djones Nybegynder
04. juli 2003 - 17:19 #10
arne_v >> hvordan kan jeg så teste om det er en fil eller et dir?
Avatar billede arne_v Ekspert
04. juli 2003 - 19:09 #11
Du bruger stat som foreslået af olennert.

Her er et komplet eksempel:

#include <stdio.h>
#include <stdlib.h>

#include <dirent.h>
#include <sys/stat.h>

#define DIRSEP "/"
#define TESTDIR "/home/arne"

void process(char *path)
{
  DIR *dirp;
  struct dirent *entp;
  struct stat stbuf;
  char fnm[256];
  dirp = opendir(path);
  while((entp = readdir(dirp)) != NULL)
  {
      if(entp->d_name[0]!='.')
      {
          sprintf(fnm,"%s%s%s",path,DIRSEP,entp->d_name);
          stat(fnm,&stbuf);
          if(!S_ISDIR(stbuf.st_mode))
          {
              printf("%s %d\n",fnm,stbuf.st_size);
          } else {
              process(fnm);
          }
      }
  }
  closedir(dirp);
  return;
}

int main()
{
  process(TESTDIR);
  return 0;
}
Avatar billede arne_v Ekspert
04. juli 2003 - 19:11 #12
Testet på en RH Linux med GCC.

Med:

#define DIRSEP "\\"
#define TESTDIR "C:\\mingw"

virker den også på Windows med mingw compiler.
Avatar billede djones Nybegynder
06. juli 2003 - 11:18 #13
det virker godt nok, men hvordan kan det være at følgende ikke virker?
meningen er at fnm bliver lowercase'd og gemt i newfnm, men indholdet af newfnm bliver noget i retning af "? B?".... ved i hvorfor?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#include <dirent.h>
#include <sys/stat.h>

#define DIRSEP "/"

void process(char *path)
{
  DIR *dirp;
  struct dirent *entp;
  struct stat stbuf;
  char fnm[256],newfnm[256];
  int i;
  dirp = opendir(path);
  while((entp = readdir(dirp)) != NULL)
  {
      if(entp->d_name[0]!='.')
      {
          sprintf(fnm,"%s%s%s",path,DIRSEP,entp->d_name);
          stat(fnm,&stbuf);
          if(!S_ISDIR(stbuf.st_mode))
          {
              for (newfnm == "", i = 0; i <= strlen(fnm); i++)
                  newfnm && tolower(fnm[i]);
              if (rename(fnm,newfnm) != 0)
              {
                  printf("\nError renaming %s to %s!",fnm,newfnm);
                  exit(1);
              }
              else printf("\nrenamed: %s -> %s",fnm,newfnm);
          }
          else
          {
              process(fnm);
          }
      }
  }
  closedir(dirp);
  return;
}

int main()
{
  char THEDIR[256];
  printf("\nEnter a dir to lowercase all the contents of (including subdirs)\n: ");
  scanf("%s",&THEDIR);
  process(THEDIR);
  return 0;
}
Avatar billede arne_v Ekspert
06. juli 2003 - 11:41 #14
Første ting:

  char THEDIR[256];
  printf("\nEnter a dir to lowercase all the contents of (including subdirs)\n: ");
  scanf("%s",&THEDIR);

skal nok ændres til:

  char THEDIR[256];
  printf("\nEnter a dir to lowercase all the contents of (including subdirs)\n: ");
  scanf("%s",THEDIR);

ingen ampersand foran THEDIR.
Avatar billede arne_v Ekspert
06. juli 2003 - 11:44 #15
Anden ting:

              for (newfnm == "", i = 0; i <= strlen(fnm); i++)
                  newfnm && tolower(fnm[i]);

ser meget suspekt ud.

              for (i = 0; i <= strlen(fnm); i++)
                  newfnm[i] = tolower(fnm[i]);

er nok mere hvad du ønsker.
Avatar billede djones Nybegynder
07. juli 2003 - 14:37 #16
takker for hjælpen :-)
Nu virker det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester