使用xargs替换字符串

时间:2013-12-19 02:05:03

标签: shell sed makefile xargs

我正在尝试为makefile中的某个目录(作为参数传递)下的每个文件收集文件路径和时间戳

所以,就是这样。

TIMESTAMP_LOG := timestamp.log
TARGET_ROOT := ../../out/root

define collect-timestamp
  $(shell find $(1) | xargs -lfn sh -c 'echo -n fn"," >> $(TIMESTAMP_LOG); stat -c %Y fn >> $(TIMESTAMP_LOG)')
endef

all:
    $(call collect-timestamp, $(TARGET_ROOT))

如果我运行这个,我会得到如下所示的整个文件路径和时间戳 ex)../../ out / root / bin / ls,133030303

但是我想摆脱文件路径中的“../../out/root”。(如果可能的话,作为参数传递)

我以为我可以使用sed或shell脚本(见下文)这样做,但显然我被卡住了。我试过了:

$(shell find $(1) | xargs -Ifn sh -c 'echo -n ${fn##$(1)}"," >> $(TIMESTAMP_LOG); stat -c %Y fn >> $(TIMESTAMP_LOG)')  

$(shell find $(1) | xargs -Ifn sh -c 'sed 's/fn//g' >> $(TIMESTAMP_LOG); stat -c %Y fn >> $(TIMESTAMP_LOG)')

2 个答案:

答案 0 :(得分:1)

如果您使用find,则在大多数情况下您不需要xargs

以下内容应该有效:

find $(1) -exec stat -c "%n,%Y" {} \; | sed 's#$(1)\/##'

请注意,我使用$(1)作为findsed替换命令的参数。

答案 1 :(得分:0)

您可以尝试

find $(1) | xargs stat -c %Y >> $(TIMESTAMP_LOG)