2017-02-10 5 views
0

Я искал какое-то время и пробовал его самостоятельно, но не смог его отсортировать до сих пор. Моя папка выглядит ниже, 4 файловbash loop file echo для каждого файла в каталоге

1.txt, 2.txt, 3.txt, 4.txt, 5.txt, 6.txt 

Я хочу напечатать время изменения файла и echo метка времени в нем

#!/bin/bash 
thedate= `ls | xargs stat -s | grep -o "st_mtime=[0-9]*" | sed "s/st_mtime=//g"` #get file modified time 
files= $(ls | grep -Ev '(5.txt|6.txt)$') #exclud 5 and 6 text file 

for i in $thedate; do 
    echo $i >> $files 
done 

Я хочу, чтобы вставить каждую метку времени для каждого файла. но с ошибкой «двусмысленной переадресации». я делаю это неправильно? Спасибо

+0

Вы не можете перенаправить на несколько файлов. Вам нужен цикл для выбора каждого обновляемого файла. – sorontar

+0

Спасибо! Есть ли метод 'forEach'? – olo

+0

Да, 'для файла в $ файлах; делать ... ; done' – codeforester

ответ

1

В этом случае files является «списком» файлов, поэтому вы, вероятно, захотите добавить еще один цикл, чтобы обрабатывать их по одному.

Ваше описание немного запутанным, но, если ваше намерение состоит в том, чтобы добавить последнюю дату изменения каждого файла в этот файл, вы можете сделать что-то вроде:

for fspec in [1-4].txt ; do 
    stat -c %y ${fspec} >>${fspec} 
done 

Примечание я использовал stat -c %y для получите время модификации, например 2017-02-09 12:21:22.848349503 +0800 - Я не уверен, какой вариант stat вы используете, но у меня нет опции -s. Вы все еще можете использовать свой вариант, вы просто должны убедиться, что это сделано на каждого файла в свою очередь, вероятно, что-то вроде (в for цикле выше):

stat -s ${fspec} | grep -o "st_mtime=[0-9]*" | sed "s/st_mtime=//g" >>${fspec} 
+0

Параметр секунд задается '% Y' (в статусе GNU). Яблочная версия stat имеет 'fmt' с' S', которые используют формат 'strftime' (я предполагаю, что с ним можно использовать% s). – sorontar

+0

Хммм ... Ты живете в Китае? Это [часовой пояс, который соответствует +0800] (https://en.wikipedia.org/wiki/UTC%2B08:00). – sorontar

+1

@sorontar: как и значительная часть Борнео, Филиппины, РПЦ и Западной Австралии (где я на самом деле * живу). Хотя, конечно, я подумываю о том, чтобы подать заявку на китайское гражданство, если бы только раздражать сумасшедшего, в настоящее время отвечающего за исполнительную власть США :-) – paxdiablo

1

Вы не можете перенаправить вывод в несколько файлов как в > $files.

Чтобы обработать несколько файлов вам нужно что-то вроде:

#!/bin/bash 

for f in ./[0-4].txt ; do 
    # get file modified time (in seconds) 
    thedate="$(stat --printf='%Y\n' "$f")" 
    echo "$thedate" >> "$f" 
done 

Если вы хотите Читабельно время изменения формата %Y по %y:

thedate="$(stat --printf='%y\n' "$f")" 
Смежные вопросы