Click here to Skip to main content
15,891,809 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,

I need the command to find all the 2 letter commands like rm, ls, cp, mv in all the diectories that ends with 'bin'.

I have found those directories using the command
ls -alR / 2>/dev/null | grep '^d' | gerp 'bin$'

Please help.
Posted
Updated 23-Nov-12 2:19am
v3
Comments
Sergey Alexandrovich Kryukov 23-Nov-12 2:07am    
Sorry, I feel that this is not quite a topic adequate to the site devoted to software development. Manipulations with bash commands, even tricky, is not quite programming... this is still user's level...
--SA
srmohanr 23-Nov-12 2:10am    
Please tell me whether
find / -type f -name "??" | grep '/*bin/' 2>/dev/null, will work correctly
Richard MacCutchan 23-Nov-12 6:43am    
Why don't you try it for yourself?
srmohanr 23-Nov-12 7:47am    
I am not having terminals with me. Please help
Richard MacCutchan 23-Nov-12 7:57am    
Neither am I. If you don't have access to a Unix/Linux system then why do you need this command?

We are developers, after all (error handling left to the reader):

C
/* finds recursively files having 2-letters name in directories whoose name ends with 'bin'
  usage:
    rd [<DIRNAME>]

  on <DIRNAME> missing, current directory is used
*/

#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>

#define BUFSIZE 0x400

int has_slash(const char * buf, size_t len);

int rd(const char * nam, int check)
{
  char buf[BUFSIZE];

  DIR * d = opendir(nam);

  if (d)
  {
    struct dirent *entry;
    while   ((entry = readdir(d)) != NULL)
    {
      if ( check && entry->d_type == DT_REG )
      {
        if (strlen(entry->d_name)==2)
        {
          printf("%s/%s\n", nam, entry->d_name);
        }
      }

      if (entry->d_type == DT_DIR)
      {
        int check;
        int len;
        strcpy( buf, nam );
        if ( ! has_slash(nam, strlen(nam)))
          strcat(buf, "/");
        strcat(buf, entry->d_name);
        len = strlen(entry->d_name);
        check =  ! strncmp( &entry->d_name[len-3], "bin", 3);
        if ( strcmp(".", entry->d_name) && strcmp("..", entry->d_name))
          rd(buf, check);
      }
    }
  }
  closedir(d);
  return 0;
}

int has_slash(const char * buf, size_t len)
{
  if ( len < 1) return 0;
  if ( buf[len-1] == '/' ) return 1;
  return 0;
}

int is_bin(const char * buf, size_t len)
{
  if ( has_slash( buf, len) )
  {
    len--;
  }
  if ( len < 3)
    return 0;
  else if ( len == 3 )
  {
    if ( ! strncmp(buf, "bin",3))
      return 1;
  }
  else
  {
    if ( !strncmp(&buf[len-4], "/bin", 4))
      return 1;
  }
  return 0;
}
int main (int argc, char * argv[])
{
  char buf[BUFSIZE];

  if (argc > 1)
  {
    strncpy(buf, argv[1], BUFSIZE-1);
    buf[BUFSIZE-1] = '\0';
  }
  else
  {
    getcwd(buf, sizeof(buf));
  }

  rd( buf, is_bin(buf, strlen(buf)));

  return 0;
}                                                                                                              


output example:
$ ./rd /

/sbin/tc
/sbin/ss
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/ln
/usr/lib/klibc/bin/dd
/usr/bin/pg
/usr/bin/pr
/usr/bin/m4
/usr/bin/at
/usr/bin/ar
/usr/bin/gs
/usr/bin/lp
/usr/bin/nm
/usr/bin/dc
/usr/bin/7z
/usr/bin/du
/usr/bin/wc
/usr/bin/bc
/usr/bin/tr
/usr/bin/ab
/usr/bin/uz
/usr/bin/od
/usr/bin/ul
/usr/bin/as
/usr/bin/nl
/usr/bin/xz
/usr/bin/id
/bin/ls
/bin/ip
/bin/cp
/bin/su
/bin/ln
/bin/mv
/bin/dd
/bin/ps
/bin/rm
/bin/df
 
Share this answer
 
v2
You already asked this question here[^] and I gave you a suggestion to get started. Have you looked at the find command and read the man pages for it? How about grep and awk?
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900