4

我将用一个例子来解释这个问题。假设我想生成一个包含两列的列表。第 1 列包含文件名,第 2 列包含该文件的 md5 和。

这可以使用以下脚本完成:

for FILE in `ls -p | grep -v "/"`;
do
    printf "%s %s\n" "$FILE" `md5 -q "$FILE"`;
done;

这可以使用管道在一条线上完成吗?我尝试过使用不同的组合sedxargsprintf我认为我遗漏了一些东西。这是我的尝试之一:

ls -p | grep -v "/" | xargs -I FILE printf "%s %s\n" FILE `md5 -q FILE`

在那次尝试中,FILE反引号内部没有被替换,这并不奇怪。

这是我应该只使用多行脚本的那种东西吗?由于没有逻辑或控制流,我觉得单线应该是可能的,也许我没有正确使用我的工具或者我没有找到合适的工具。

为标题道歉,我不知道该怎么称呼这个问题。

4

4 回答 4

6

你可以使用md5sum,因为我没有md5:)

ls -p | grep -v / | xargs md5sum | awk '{print $2,$1}'

这可能是一种更安全、更稳健的方式:

find -maxdepth 1 -type f -exec md5sum {} \; | awk '{s=$2; $2=$1; $1=s;}1'

这应该适用于 md5:

find -maxdepth 1 -type f -exec md5sum {} \; | sed 's/[^(]*(\([^)]*\)) =/\1/'
于 2013-06-07T04:21:57.083 回答
3

怎么样:

ls *.cc | xargs -I FILE md5 FILE | sed 's/^MD5 (\(.*\)) =/\1/'

或者,如果您担心文件名中的空格(我认为您无论如何都不应该允许自己这样做),

find . -name "*.cc" -maxdepth 1 | xargs -I FILE md5 FILE | sed 's/^MD5 (\(.*\)) =/\1/'
于 2013-06-07T04:24:25.333 回答
1
ls -p | grep -v "/" | xargs -I FILE sh -c 'printf "%s %s\n" $0 `md5 -q $0`' FILE

您的代码不起作用,因为在将参数传递给xargs. 您需要将它们括在引号中,然后将该参数传递给sh.

但是,这似乎是一种不好的方法。它不适用于名称中带有空格的文件,并且grep是一种跳过目录的愚蠢方法。

for FILE in *
do
  if  [ -f "$FILE" ]
  then printf "%s %s\n" "$FILE" `md5 -q "$FILE"`
done
于 2013-06-07T04:16:46.797 回答
1

要解决有关名称中包含奇怪字符的文件名的问题,这些字符需要转义、EXCEPT "字符或带有 md5 和和空格的文件名作为其名称的一部分:

find . -maxdepth 1 -type f  -print0 |xargs -0 -n1 -I{} bash -c 'echo -n "{} " ; cat "{}" |md5sum' | sed 's/ -$//'

Usingcatmd5sum标准输入 ( -) 生成文件名,我们用sed. 但是,不需要复杂的正则表达式来更改列的顺序,因为我们使用echo -n将文件名打印为输出的第一列。

例子:

samveen@precise:/tmp/tmp.JpmDNkhcRG$ touch "ab'c"
samveen@precise:/tmp/tmp.JpmDNkhcRG$ touch "ab d41d8cd98f00b204e9800998ecf8427e c"
samveen@precise:/tmp/tmp.JpmDNkhcRG$ touch "ab c"
samveen@precise:/tmp/tmp.JpmDNkhcRG$ touch "abc"
samveen@precise:/tmp/tmp.JpmDNkhcRG$ touch "ab
> c"
samveen@precise:/tmp/tmp.JpmDNkhcRG$ touch "ab\!c"

samveen@precise:/tmp/tmp.JpmDNkhcRG$ find . -maxdepth 1 -type f  -print0 |xargs -0 -n1 -I{} bash -c 'echo -n "{} " ; cat "{}" |md5sum'| sed 's/ -$//'
./ab'c d41d8cd98f00b204e9800998ecf8427e
./ab d41d8cd98f00b204e9800998ecf8427e c d41d8cd98f00b204e9800998ecf8427e
./ab c d41d8cd98f00b204e9800998ecf8427e
./abc d41d8cd98f00b204e9800998ecf8427e
./ab
c d41d8cd98f00b204e9800998ecf8427e
./ab\!c d41d8cd98f00b204e9800998ecf8427e
于 2013-06-07T06:29:51.777 回答