Linux 为什么bc和args不';我们不能在一条线上合作吗?

Linux 为什么bc和args不';我们不能在一条线上合作吗?,linux,bash,shell,pipe,bc,Linux,Bash,Shell,Pipe,Bc,我需要在同一行中使用xargs(1)和bc(1)的帮助。我可以多行操作,但我真的很想在一行中找到解决方案 问题是:下面一行将打印file.txt的大小 ls -l file.txt | cut -d" " -f5 下面一行将打印1450(显然是1500-50) 尝试将这两个因素相加,我会这样做: ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50' | bc 问题是,它不起作用了!:) 我知道xargs可能不是正确的命令,但

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

问题是:下面一行将打印
file.txt的大小

ls -l file.txt | cut -d" " -f5
下面一行将打印
1450
(显然是1500-50)

尝试将这两个因素相加,我会这样做:

ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50' | bc
问题是,它不起作用了!:)

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

这不是我第一次遇到这种问题。这将是很大的帮助


谢谢

这可能适合您:

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}'
如果你这样做

ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50'
您将看到以下输出:

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

只需使用
-n1
而不是
-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的表达式。

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

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

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


wc-c这里是另一个解决方案,它只使用一个外部命令:
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

谢谢,伙计,我不知道用“&”替换模式匹配。最好知道我的错误,然后再找一个替代方案:)
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
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
let file_size=$(stat -f "%z" mini.csv)-50