2013-12-19 3 views
0

Я пытаюсь собрать путь к файлу и временную метку для каждого файла под определенный каталог (который передается в качестве аргумента) в Makefileзамена строки с помощью xargs

Таким образом, это выглядит следующим образом.

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)) 

Если я запускаю это, я бы получить полный путь к файлу и метку времени, как показано ниже ех) ../../out/root/bin/ls,133030303

, но я хочу, чтобы получить избавиться от "../../out/root" в пути к файлу. (передавая как аргумент, если это возможно)

Я думал, что смогу сделать это с помощью сценария sed или оболочки (см. ниже), но, видимо, я застрял. Я пробовал:

$(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)') 
+0

Можете ли вы показать нам, что вы пробовали? –

+0

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

+0

$ (shell find $ (1) | xargs -Ifn sh -c' sed 's/fn // g' >> $ (TIMESTAMP_LOG); stat -c% Y fn >> $ (TIMESTAMP_LOG) ') Я пробовал выше и пару больше, но я не думаю, что они были правы – Todd

ответ

1

Если вы используете find, вам не нужно xargs в большинстве случаев.

Следующие должны работать:

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

Обратите внимание, что я использую $ (1) команду и как параметр find и в sed замещении.

+0

Мне пришлось немного изменить это, но это сработало для меня! :) – Todd

0

Вы можете попробовать

find $(1) | xargs stat -c %Y >> $(TIMESTAMP_LOG) 
Смежные вопросы