How to collect directory listing along with each f

2019-07-23 04:26发布

问题:

I use the following command to get dir listing in nix(Linux, AIX, Sunos, HPUX) platforms

Command

ls -latr 

Ouput

drwxr-xr-x  2 ricky support   4096 Aug 29 11:59 lib 
-rwxrwxrwx  1 ricky support    924 Aug 29 12:00 initservice.sh

cksum command is used for getting CRC checksum.

How can the CRC Checksum be appended after each file something (including directory listing too) like below, maintaining the below format in these nix(Linux, AIX, Sunos, HPUX) platforms?

drwxr-xr-x  2 ricky support   4096 Aug 29 11:59 lib 
-rwxrwxrwx  1 ricky support    924 Aug 29 12:00 initservice.sh 4287252281

Update Note : No third party application, I am using java/Groovy to parse the output ultimately into a given format which forms a xml using groovy XmlSlurper (XML's get generated around 5MB sized)

"permission","hardlink","owner","group","fsize","month","date","time","filename","checksum"

All Suggestions are welcome! :)

Update with my code

But here I am calculating md5hex which gives a similar output as md5sum command from linux. So it's no longer cksum as I cannot use jacksum bcz of some licensing issue :(

class CheckSumCRC32 {

public def getFileListing(String file){
    def dir = new File(file)
    def filename = null
    def md5sum = null
    def filesize = null
    def lastmodified = null
    def lastmodifiedDate = null
    def lastmodifiedTime = null
    def permission = null
    Format formatter = null
    def list=[]
    if(dir.exists()){
        dir.eachFileRecurse (FileType.FILES) { fname ->
            list << fname
          }
        list.each{fileob->
            try{
                md5sum=getMD5CheckSum(fileob.toString())
                filesize=fileob.length()+"b"
                lastmodified=new Date(fileob.lastModified())
                lastmodifiedDate=lastmodified.format('dd/MM/yyyy')
                formatter=new SimpleDateFormat("hh:mm:ss a")
                lastmodifiedTime=formatter.format(lastmodified)
                permission=getReadPermissions(fileob)+getWritePermissions(fileob)+getExecutePermissions(fileob)
                filename=getRelativePath("E:\\\\temp\\\\recurssive\\\\",fileob.toString())
                println "$filename, $md5sum, $lastmodifiedDate, $filesize, $permission, $lastmodifiedDate, $lastmodifiedTime "
            }
            catch(IOException io){
                println io
            }
            catch(FileNotFoundException fne){
                println fne
            }   
            catch(Exception e){
                println e
            }           
        }
    }       
}

public def getReadPermissions(def file){
    String temp="-"
    if(file.canRead())temp="r"
    return temp
}
public def getWritePermissions(def file){
    String temp="-"
    if(file.canWrite())temp="w"
    return temp
}
public def getExecutePermissions(def file){
    String temp="-"
    if(file.canExecute())temp="x"
    return temp
}
public def getRelativePath(def main, def file){""
    return file.toString().replaceAll(main, "")
}


public static void main(String[] args) {
    CheckSumCRC32 crc = new CheckSumCRC32();
    crc.getFileListing("E:\\temp\\recurssive")
}
}

Output

release.zip, 25f995583144bebff729086ae6ec0eb2, 04/06/2012, 6301510b, rwx, 04/06/2012, 02:46:32 PM 
file\check\release-1.0.zip, 3cc0f2b13778129c0cc41fb2fdc7a85f, 18/07/2012, 11786307b, rwx, 18/07/2012, 04:13:47 PM 
file\Dedicated.mp3, 238f793f0b80e7eacf5fac31d23c65d4, 04/05/2010, 4650908b, rwx, 04/05/2010, 10:45:32 AM 

but still I need a way to calculate hardlink, owner & group. I searched on the net it looks like java7 has this capability & I am stuck with java6. Any help?

回答1:

Take a look at http://www.jonelo.de/java/jacksum/index.html - it is reported to provide cksum - compatible CRC32 checksums.

BTW, I tried using java.util.zip.CRC32 to calculate checksums, and it gives a different value than cksum does, so must use a slightly different algorithm.

EDIT: I tried jacksum, and it works, but you have to tell it to use the 'cksum' algorithm - apparently that is different from crc32, which jacksum also supports.



回答2:

Well, you could run the command, then, for each line, run the cksum and append it to the line.

I did the following:

dir = "/home/will"

"ls -latr $dir".execute().in.eachLine { line ->

  // let's omit the first line, which starts with "total"
  if (line =~ /^total/) return

  // for directories, we just print the line
  if (line =~ /^d/) 
  {
    println line
  } 
  else 
  {
    // for files, we split the line by one or more spaces and join 
    // the last pieces to form the filename (there must be a better 
    // way to do this)
    def fileName = line.split(/ {1,}/)[8..-1].join("")

    // now we get the first part of the cksum
    def cksum = "cksum $dir/$fileName".execute().in.text.split(/ {1,}/)[0]

    // concat the result to the original line and print it
    println "$line $cksum"
  }
}

Special attention to my "there must be a better way to do this".