在命令中重用或重复管道输入作为参数(给出示例)

Tim*_*nel 4 unix bash shell

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

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

for FILE in `ls -p | grep -v "/"`;
do
    printf "%s %s\n" "$FILE" `md5 -q "$FILE"`;
done;
Run Code Online (Sandbox Code Playgroud)

可以使用管道在一条线上完成吗?我使用的不同组合尝试sed,xargs并且printf但是我觉得我失去了一些东西.这是我的一次尝试:

ls -p | grep -v "/" | xargs -I FILE printf "%s %s\n" FILE `md5 -q FILE`
Run Code Online (Sandbox Code Playgroud)

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

这是我应该使用多行脚本的事情吗?由于没有逻辑或控制流程,我觉得应该有一个单行,也许我没有正确使用我的工具或者我没有找到合适的工具.

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

per*_*eal 6

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

ls -p | grep -v / | xargs md5sum | awk '{print $2,$1}'
Run Code Online (Sandbox Code Playgroud)

这可能是一种更安全,更健壮的方式:

find -maxdepth 1 -type f -exec md5sum {} \; | awk '{s=$2; $2=$1; $1=s;}1'
Run Code Online (Sandbox Code Playgroud)

这应该适用于md5:

find -maxdepth 1 -type f -exec md5sum {} \; | sed 's/[^(]*(\([^)]*\)) =/\1/'
Run Code Online (Sandbox Code Playgroud)