我需要在同一行使用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可能不是正确使用的命令,但它是我能找到的唯一一个可以让我决定从管道中放入参数的位置的命令。
这不是我第一次遇到这类问题。这将是一个很大的帮助......
由于
答案 0 :(得分:1)
这可能对您有用:
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}'
答案 1 :(得分: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。
答案 2 :(得分: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
答案 3 :(得分: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