2012-08-22 33 views
1

我想实现这个作为一个Makefile任务:但是如何在Makefile中获取Unix上的文件大小?

# step 1: 
curl -u username:password -X POST \ 
    -d '{"name": "new_file.jpg","size": 114034,"description": "Latest release","content_type": "text/plain"}' \ 
    https://api.github.com/repos/:user/:repo/downloads 

# step 2: 
curl -u username:password \ 
-F "key=downloads/octocat/Hello-World/new_file.jpg" \ 
-F "acl=public-read" \ 
-F "success_action_status=201" \ 
-F "Filename=new_file.jpg" \ 
-F "AWSAccessKeyId=1ABCDEF..." \ 
-F "Policy=ewogIC..." \ 
-F "Signature=mwnF..." \ 
-F "Content-Type=image/jpeg" \ 
-F "[email protected]_file.jpg" \ 
https://github.s3.amazonaws.com/ 

在第一部分中,我需要得到的文件大小(和内容类型,如果它很容易,不需要虽然),所以一些变量:

{"name": "new_file.jpg","size": $(FILE_SIZE),"description": "Latest release","content_type": "text/plain"} 

我试过,但它不工作(苹果机10.6.7):

$(shell du path/to/file.js | awk '{print $1}') 

任何想法如何做到这一点?

+0

你需要以字节为单位的大小吗? GNU coreutils'du'命令有一个'-b'选项来执行此操作; [MacOS du](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/du.1.html)显然没有。小心不要意外地给'du'输入一个目录名称。 –

回答

0

我认为这是其中解析的 ls输出是合法的情况下:

% FILE_SIZE=`ls -l $filename | awk '{print $5}'` 

(不,这不是:使用stat,由基思·汤普森指出)

对于类型,你可以使用

% FILE_TYPE=`file --mime-type --brief $filename` 
+0

请注意,如果'$ filename'是一个符号链接,这会给你符号链接的大小,而不是目标文件的大小。在这种情况下,使用'ls -lL'来获取实际文件的大小。 –

+1

那么,你想'stat'。看Keith的回答。 – tripleee

+0

Gasp!怎么能'stat'已经存在了大约十年,我不知道它呢? –

4

如果你有GNU coreutils:

FILE_SIZE=$(stat -L -c %s $filename) 

-L告诉它遵循符号链接;没有它,如果$filename是一个符号链接,它会给你符号链接的大小,而不是目标文件的大小。

MacOS stat相当于似乎是:

FILE_SIZE=$(stat -L -f %z) 

,但我一直没能尝试。 (我写这是一个shell命令,而不是make命令。)您也可以找到-s选项很有用:

在“壳输出”屏幕显示信息,适合初始化变量。

+0

如果你本地没有'stat',看看你是否有'find -printf'%s''。 – tripleee

+0

'stat -L -f%z'在OS X上的确是正确的 –