2016-02-02 1 views
0

Я использую комбинацию stat и touch для получения/установки временных меток на файлах и репертуарах. Но мне нужно другой набор окон, если на Mac OS X или GNU/Linux:Как получить/установить время модификации кросс-платформенным способом из сценария (bash)?

  1. touch на Mac OS X не знает вариант -d описал там

    http://pubs.opengroup.org/onlinepubs/9699919799/utilities/touch.html

    , который позволяет такие вещи, как

    touch -d "2007-11-12 10:15:30.002Z" ajosey 
    

    Я, по-видимому, ограничен -t [[CC]YY]MMDDhhmm[.SS].

  2. stat также отличается, например, на счет Linux шахты, он не признает -t format от stat на Mac OS X.

Таким образом, на Linux я в настоящее время сделать что-то вроде

stat --format 'touch -d "%y" "%n"' index.html 

создать командную строку типа

touch -d "2015-04-08 00:38:51.940365000 +0200" "index.html" 

, тогда как на Mac OS X У меня есть

stat -f "touch -t %Sm \"%N\"" -t %Y%m%d%H%M.%S index.html 

, который дает мне что-то (это не то же самое, как index.html до), как:

touch -t 201503281339.42 "index.html" 

Как мог справиться с этим единым образом? Возможно, с некоторыми sed между ними?

Мне нужно создать последовательность команд touch в формате, работающем на обеих платформах. Создание этой последовательности должно работать на обеих платформах.

Я открыт для других сценариев, чем bash, с ограничением, что на стороне Linux у меня есть система без прав администратора. perl есть This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi.

+0

Думаю, вам просто нужно написать условное/включить 'uname -o'? ('if [$ (uname -o) == linux], затем' ....) –

+0

Вы можете отменить часовой пояс. Он не будет записан в файловую систему: http://stackoverflow.com/questions/30119732/do-filesystems-store-time-zone-information – ceving

+0

@JeffY Я надеялся на код, общий для GNU/Linux, такой как Ubuntu и Mac OS X ... сохранение условности в крайнем случае. И даже если использовать условия, я должен иметь возможность создавать на Linux последовательность команд, подходящих для Mac OS, и наоборот. – jfbu

ответ

1

Установите GNU Coreutils на свой Mac, и вы можете перестать беспокоиться о несовместимости. Объясняется here как это сделать.

+0

Я исследую этот вариант, спасибо. – jfbu

0

Short лучшего метода, я временно принять следующее, который на основе этих наблюдений:

  1. touch -t работает так же на моем Mac OS X и Linux У меня тоже есть доступ.

  2. На стороне Linux, я могу использовать date -d для преобразования даты, как производится stat -c %y в формате YYYYMMDDHHMM.SS я могу использовать на входе в touch -t, так и на стороне Mac OS X можно использовать непосредственно stat с подходящими вариантами этот результат.

Для пакетной обработки файлов в репертуаре, где я использовал stat с * расширения оболочки, можно заменить, что с петлей на for оболочки.

Подставив эти вещи вместе я заканчиваю со следующим сценарием:

#!/bin/sh                  
case `uname -s` in 
    "Linux") 
     MYDATEFORTOUCH() { 
      date -d"$(stat -c %y "$1")" +%Y%m%d%H%M.%S 
     } 
     ;; 
    "Darwin") 
     MYDATEFORTOUCH() { 
      stat -f %Sm -t %Y%m%d%H%M.%S "$1" 
     } 
     ;; 
    *) 
     MYDATEFORTOUCH() { 
      197001010000.00 
     } 
     ;; 
esac 

echo "#!/bin/sh" > fichierTEMPA 

for file in * 
do echo "touch -ch -t $(MYDATEFORTOUCH "$file") \"$file\"" >> fichierTEMPA 
done 

Выполнения этого в репертуаре создает файл (с глупым именем здесь fichierTEMPA), которая представляет собой ряд touch -t команд. -h предназначен для не следующих символических ссылок, на mac os x, он подразумевает -c, который должен не создавать файл, которого не было, я не уверен, что -c также подразумевается -h на GNU/Linux.

Смежные вопросы