4

我需要帮助在同一行中使用 xargs(1) 和 bc(1)。我可以做多行,但我真的想在一行中找到解决方案。

这是问题所在:以下行将打印file.txt

ls -l file.txt | cut -d" " -f5

并且,以下行将打印1450(显然是 1500 - 50)

echo '1500-50' | bc

试图将这两者加在一起,我这样做:

ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50' | bc

问题是,它不起作用!:)

我知道 xargs 可能不是正确使用的命令,但它是我能找到的唯一一个可以让我决定将我从管道中获得的参数放在哪里的命令。

这不是我第一次遇到此类问题。会有很大帮助的。。

谢谢

4

4 回答 4

2

这可能对您有用:

ls -l file.txt | cut -d" " -f5 | sed 's/.*/&-50/' | bc

事实上,你可以删除削减:

ls -l file.txt | sed -r 's/^(\S+\s+){4}(\S+).*/\2-50/' | bc

或者使用 awk:

ls -l file.txt | awk '{print $5-50}'
于 2013-07-28T08:23:28.887 回答
1

如果你这样做

ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50'

你会看到这个输出:

23
-50

这意味着,bc没有看到完整的表达式。

只需使用-n 1而不是-0

ls -l file.txt | cut -d" " -f5 | xargs -n 1 -I {} echo '{}-50'

你得到

23-50

bc将愉快地处理:

ls -l file.txt | cut -d" " -f5 | xargs -n 1 -I {} echo '{}-50' | bc
-27

所以你的基本问题是,它-0需要的不是行,而是\0终止的字符串。因此管道中先前命令的换行符会混淆 bc 的表达式。

于 2013-07-28T08:33:33.627 回答
1

解析ls命令的输出并不是最好的主意。(真的)。

您可以使用许多其他解决方案,例如:

find . -name file.txt -printf "%s\n"

或者

stat -c %s file.txt

或者

wc -c <file.txt

并且可以使用 bash 算术,以避免不必要的慢进程分叉,例如:

find . -type f -print0 | while IFS= read -r -d '' name
do
        size=$(wc -c <$name)
        s50=$(( $size - 50 ))
        echo "the file=$name= size:$size minus 50 is: $s50"
done
于 2013-07-28T10:36:57.480 回答
1

这是另一种解决方案,它只使用一个外部命令stat::

file_size=$(stat -c "%s" file.txt) # Get the file size
let file_size=file_size-50         # Subtract 50

如果您真的想将它们组合成一行:

let file_size=$(stat -c "%s" file.txt)-50

stat命令为您获取文件大小(以字节为单位)。上面的语法适用于 Linux(我针对 Ubuntu 进行了测试)。在 Mac 上,语法有点不同:

let file_size=$(stat -f "%z" mini.csv)-50
于 2013-07-28T15:16:21.240 回答