Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用If/Else和awk调用bash命令_Bash_Shell_Command Line_Awk_S3cmd - Fatal编程技术网

使用If/Else和awk调用bash命令

使用If/Else和awk调用bash命令,bash,shell,command-line,awk,s3cmd,Bash,Shell,Command Line,Awk,S3cmd,我希望得到我的S3存储桶中所有大于200KB的文件。经过一些研究,我能够使用以下命令递归生成S3存储桶中大于200 KB的所有文件的列表: s3cmd ls -r s3://mybucket | awk '{if ($3 > 200000) print $4}' > files.txt 理想情况下,我不只是生成一个列表,而是不仅要查找大于200KB的所有文件,还要在同一个命令中获取它们 我一直在寻找这样的东西,但它显然是不正确的 s3cmd ls -r s3://mybucket

我希望得到我的S3存储桶中所有大于200KB的文件。经过一些研究,我能够使用以下命令递归生成S3存储桶中大于200 KB的所有文件的列表:

s3cmd ls -r s3://mybucket | awk '{if ($3 > 200000) print $4}' > files.txt
理想情况下,我不只是生成一个列表,而是不仅要查找大于200KB的所有文件,还要在同一个命令中获取它们

我一直在寻找这样的东西,但它显然是不正确的

s3cmd ls -r s3://mybucket | awk '{if ($3 > 200000) "s3cmd get $4" }'
仅供参考:如果您不熟悉s3cmd:$3返回文件大小,$4返回s3cmd返回的特定文件的文件名

提前谢谢你的帮助

问题:
如何使用awk调用另一个bash命令中的另一个bash命令?

您可以在
awk
中使用
system
函数:

s3cmd ls -r s3://mybucket | awk '($3 > 200000) { system("s3cmd get " $4); }'

您可以在
awk
中使用
system
功能:

s3cmd ls -r s3://mybucket | awk '($3 > 200000) { system("s3cmd get " $4); }'

在使用从文本文件获取的参数执行二进制文件时,
bash
会更好,因为它可以安全地扩展包含空格作为参数的变量

while read -ra A; do
    [[ ${A[2]} -gt 200000 ]] && s3cmd get "${A[3]}"
done < <(s3cmd ls -r s3://mybucket)
读取时-ra A;做
[${A[2]}-gt 200000]&&s3cmd获取“${A[3]}”

完成<当使用从文本文件获取的参数执行二进制文件时,
bash
会更好,因为它可以安全地扩展包含空格的变量作为参数

while read -ra A; do
    [[ ${A[2]} -gt 200000 ]] && s3cmd get "${A[3]}"
done < <(s3cmd ls -r s3://mybucket)
读取时-ra A;做
[${A[2]}-gt 200000]&&s3cmd获取“${A[3]}”


done<关于带空格文件名的常见警告适用于此处。此帖子被标记为低质量。我建议删除。请通过解释和一些限定词来提高你文章的质量,以便将来的用户理解。@Jeremy这是一个合理的答案。它不值得删除。@Jeremy这是这个问题的正确答案,无法想象你为什么要删除它。这很清楚,但如果任何人有问题,他们总是可以问。我认为这里缺少
-d'\n'
。通常关于带空格的文件名的警告适用于这里。这篇文章被标记为低质量。我建议删除。请通过解释和一些限定词来提高你文章的质量,以便将来的用户理解。@Jeremy这是一个合理的答案。它不值得删除。@Jeremy这是这个问题的正确答案,无法想象你为什么要删除它。这很清楚,但如果任何人有问题,他们总是可以问。我想这里缺少了
-d'\n'
。如果发生了什么事?
($3>200000)
是隐含的if条件。$4似乎没有被传递到系统(“s3cmd获取$4”),有没有想过绕过这个问题?你能试试:
awk”($3>200000){system(“s3cmd获取”)$4);}'
如果执行
系统(“s3cmd获取”$4)
-如果
$4
包含shell globbing字符会发生什么情况?If发生了什么情况?
($3>200000)
是隐式If条件。$4似乎没有被传递到系统(“s3cmd获取$4”),有什么想法解决这个问题吗?你可以试试:
awk'($3>200000){system(“s3cmd get”$4);}'
如果执行
system(“s3cmd get”$4)
-如果
$4
包含shell globbing字符,会发生什么?awk不是shell。不要用嵌套调用层来破坏代码(
shell{awk{system{shell{s3cmd}}}}
)要想让它表现得像一个shell,只需让shell调用awk,然后对其结果进行操作(
shell{awk | xargs s3cmd}
),就像@GlennJackman shows.awk不是一个shell。不要用嵌套调用层(
shell{awk{system{shell{s3cmd}}}
)来破坏代码要想让它像一个,只需让shell调用awk,然后对其结果进行操作(
shell{awk|xargs s3cmd}
)如@GlennJackman shows。这将解释文件名中的反斜杠,例如,将名为
foo\tbar
的文件转换为
foobar>
,其中
表示文本制表符。这将解释文件名中的反斜杠,例如,将名为
foo\tbar
的文件转换为
foobar>
其中
表示文本制表符。