1

次のコマンドを使用して、nix (Linux、AIX、Sunos、HPUX) プラットフォームでディレクトリ リストを取得します。

指示

ls -latr 

出力

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

cksumコマンドは、CRC チェックサムを取得するために使用されます。

これらの nix (Linux、AIX、Sunos、HPUX) プラットフォームで以下の形式を維持しながら、以下のように各ファイル (ディレクトリ リストも含む) の後に CRC チェックサムを追加するにはどうすればよいですか?

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

更新メモ: サードパーティのアプリケーションはありません。Java/Groovy を使用して出力を解析し、最終的に groovy XmlSlurper を使用して xml を形成する特定の形式にします (XML は約 5MB のサイズで生成されます)。

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

すべての提案を歓迎します! :)

私のコードで更新

md5sumしかし、ここではLinux からのコマンドと同様の出力を与える md5hex を計算しています。cksumしたがって、ライセンスの問題でjacksum bczを使用できないため、もはやそうではありません:(

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")
}
}

出力

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 

それでも、ハードリンク、所有者、およびグループを計算する方法が必要です。ネットで検索したところ、Java7にはこの機能があり、Java6に固執しているようです。何か助けはありますか?

4

2 に答える 2

1

http://www.jonelo.de/java/jacksum/index.htmlを見てください- cksum 互換の CRC32 チェックサムを提供すると報告されています。

ところで、java.util.zip.CRC32 を使用してチェックサムを計算しようとしましたが、cksum とは異なる値が返されるため、わずかに異なるアルゴリズムを使用する必要があります。

編集:jacksumを試してみましたが、動作しますが、「cksum」アルゴリズムを使用するように指示する必要があります-明らかに、jacksumもサポートするcrc32と異なります。

于 2012-09-01T22:47:48.193 に答える
0

コマンドを実行してから、各行に対して を実行し、cksumそれを行に追加することができます。

私は次のことをしました:

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"
  }
}

私の「これを行うためのより良い方法があるはずです」に特に注意してください。

于 2012-09-01T18:37:07.503 に答える