2012-02-10 3 views
1

コマンドリターンパスを見つける直接リターン
ではなく、このCのLinuxは、直接

  sprintf(inputPath, "find -name %s",fileNameList[i]); 
      fpop=popen(inputPath, "r"); 
      fgets(inputPath, sizeof(inputPath)-1, fpop) ; 
      pclose(fpop); 

かを介して実行いくつかのようなコマンドのようなものとして、findコマンドを使用してパスを取得するための簡単な方法がありますcはパスを返しますか?

+1

いいえ、戻り値はfind(1)の呼び出しによる終了値です。あなたは出力を解析しているつもりです。 – tbert

+0

私が見つかりました: http://stackoverflow.com/questions/671461/how-can-i-execute-external-commands-in-c-linux –

答えて

2

私は現在から検索を開始簡単にするために

#define _XOPEN_SOURCE 500 
#include <ftw.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdint.h> 

static int s_argc; 
static char** s_argv; 

static int 
display_info(const char *fpath, const struct stat *sb, 
      int tflag, struct FTW *ftwbuf) 
{ 
    int matched = 0, i; 
    for (i=0; i<s_argc; i++) 
    { 
     const char* match = strstr(fpath, s_argv[i]); 
     matched |= (match && *match 
       && (strlen(match) == strlen(s_argv[i]))   // matches at end 
       && ((match == s_argv[i]) || (match[-1] == '/'))); // is full basename 
    } 

    if (matched) 
    { 
     printf("%-3s %2d %7jd %-40s %d %s\n", 
       (tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" : 
       (tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" : 
       (tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" : 
       (tflag == FTW_SLN) ? "sln" : "???", 
       ftwbuf->level, (intmax_t) sb->st_size, 
       fpath, ftwbuf->base, fpath + ftwbuf->base); 
    } 

    return 0;   /* To tell nftw() to continue */ 
} 

int 
main(int argc, char *argv[]) 
{ 
    s_argc = argc-1; 
    s_argv = argv+1; 

    int flags = FTW_DEPTH | FTW_PHYS; 

    if (nftw(".", display_info, 20, flags) == -1) 
    { 
     perror("nftw"); 
     exit(EXIT_FAILURE); 
    } 
    exit(EXIT_SUCCESS); 
} 

gcc test.c -o testでコンパイルする)自分自身を見つける行うために)(nftw使用することをお勧め、それがコンセプトのC.単純な証拠でコーディングすることはあまりないのです作業ディレクトリ( "。")。このように使用:あなたが発注を見ることができます

f 6  0 ./a/b/c/e/subdir/target.txt    17 target.txt 
f 6  0 ./a/b/c/g/subdir/target.txt    17 target.txt 
dp 3  0 ./a/b/c         6 c 
dp 2  0 ./a/b         4 b 

深さ優先である:

./test target.txt b c 

プリントは何も今

mkdir -pv a/b/c/{d,e,f,g}/subdir 
touch a/b/c/{e,g}/subdir/target.txt 
./test target.txt b c 

プリント(既存のようなファイルを持っていないと仮定した場合)最初はですが、フラグを微調整すると簡単に変更できますnftw

+0

1本、私は恐れていたかなりきちんとしていていますいくつかのコマンド/構文の面でもっと簡単なことを聞​​いていましたが、私が逃したのは、呼び出されたときに文字列としてパスを返します。それはtbertによって明らかにされました。 –

0

これを達成するためにdupまたはdup2呼び出しを試すことができますか?

+0

http://stackoverflow.com/questions/8093315/nftw-different-on-bsd –

関連する問題