Сохраните измененную метку времени после редактирования

В Вашем втором примере, путем размещения var и var2 на отдельных строках, это делает команду тем же как

while var=9876; var2=765; read line

while команда допускает список команд прежде, чем выполнить команды в - цикл с условием продолжения.   help while шоу это:

в то время как: в то время как КОМАНДЫ; сделайте КОМАНДЫ;готово
  Выполните команды, пока тест успешно выполняется.
  Разверните и выполните КОМАНДЫ пока заключительная команда в
  'в то время как' КОМАНДЫ имеют статус выхода нуля.
  Статус выхода: Возвращает состояние последней выполняемой команды.

С другой стороны, когда переменное присвоение предшествует команде (в этом случае read), и то присвоение только сопровождается пробелом, объем той переменной локален для команды ONLY! (внутренне)...

См.: В, 'в то время как IFS = чтение..', почему IFS не имеет никакого эффекта?

21
10.05.2013, 16:56
7 ответов

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

cp -p post temp
vim temp
touch -r post temp
cp -p temp post

Или еще лучше:

touch -r post timestamp
vim post
touch -r timestamp post
23
27.01.2020, 19:43

Я записал сценарий Perl для этого.

Это - обертка вокруг энергии, сохраненной в ~/bin/vim-nomtime.pl и принесенный в использование через alias vim='~/bin/vim-nomtime.pl' в моем .bashrc.

#!/usr/bin/perl
use strict;
use warnings;
use Cwd qw/ abs_path /;

my @dirs = qw( ~/blosxom /srv/relief/blosxom );

s/^~/$ENV{HOME}/ foreach @dirs;

# do we want to preserve stamp on this file?
sub fits {
    my $dir = abs_path($_[0]);
    my $fits = 0;
    foreach (@dirs) {
        my $preserved_dir = abs_path($_);
        $fits++ if $dir =~ m|^$preserved_dir|;
    }
    return $fits != 0;
}

# store original stamps
my $original_stamp;
foreach (@ARGV) {
    if ( -f $_ and fits($_) ) {
        $original_stamp->{$_} = (stat($_))[9];
    }
}

# run vim as you would
my $cmd = join ' ', 'vim', @ARGV;  
system($cmd) == 0
    or die "vim failed: $!";

# restore stamps if they have changed
foreach (keys %$original_stamp) {
    next unless -f $_;
    my $current_stamp = (stat($_))[9];
    unless ($current_stamp == $original_stamp->{$_}) {
        utime $original_stamp->{$_}, $original_stamp->{$_}, $_;
    }
}

Некоторые хорошие функции:

  • поддержки несколько имен файлов

  • поддержки несколько "наблюдаемых" директоров

  • поддержки symlinked dir

  • может быть улучшен с другими критериями

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

  • это восстанавливает штамп только после того, как энергия вышла, поэтому если я делаю долгое редактирование и регулярно сохраняю, деревня файла "всплывающее окно" как новое, пока я не вышел из энергии

  • это поддерживает несколько файлов на командной строке, но довольно наивным способом - это только проверяет если вещь на @ARGV файл. Это, вероятно, не работало бы с подстановочными знаками (например. vim note-*.txt) или другой забавный материал

  • это не доказательство катастрофического отказа, вероятно, даже НЕ ПОНУКНИТЕ защищенный (который мог быть сделан),

  • ... wel, это - обертка. (Я имею в виду, если бы мы решили все через обертку, сколько оберток мы имели бы, прежде чем что-то плохо произошло?)

5
27.01.2020, 19:43

Если у Вас должна быть некоторая забава:

file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file"

Путь замены с Вашим фактическим путем к файлу

7
27.01.2020, 19:43

Этот короткий сценарий сохранит измененное время, если какой-либо родительский dir файла будет содержать a .nomtime файл:

#!/bin/bash

dir="${1%/*}"
[ "$dir" = "$1" ] && dir=.
dir=$( readlink -f "$dir" )

nomtime=
while [ -n "$dir" ]; do
    if [ -f "$dir/.nomtime" ]; then
        nomtime=1
        break
    fi
    dir="${dir%/*}"
done

if [ "$nomtime" = 1 ]; then
    T=`tempfile`
    touch -r "$1" $T
fi

vi "$1"

if [ "$nomtime" = 1 ]; then
    touch -r $T "$1"
    rm $T
fi
1
27.01.2020, 19:43

Попробуйте эту bashфункцию (на основе ответа Shâu Shắc)

vi-preserve-time () {
    for file in "$@"; do
        local mtime=$(stat -c %y "$file")
        vi "$file"
        touch -d "$mtime" "$file"
    done
}

Теперь мы можем редактировать файл и сохранять измененное время, используя это

vi-preserve-time file1.txt file2.txt
2
27.01.2020, 19:43

Существует возможность скопировать метку времени из другого файла.

touch -m -r file_source file_target

Пример:

[oracle@es abc]$ ls -tlr
total 4
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
[oracle@es abc]$ echo "hi hi" > b
[oracle@es abc]$ ls -ltr
total 4
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
-rw-r--r--. 1 oracle oinstall   6 May 13 18:58 b
[oracle@es abc]$ touch -m -r aa.txt b
[oracle@es abc]$ ls -tlr
total 8
-rw-r--r--. 1 oracle oinstall   6 May  8 20:35 b
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
[oracle@es abc]$ cat b
hi hi
2
27.01.2020, 19:43

Я нашел отличное решение на этой веб-странице , которая создает функцию vim для сохранения текущего файла с сохранением существующего времени модификации,и привязывает эту функцию к функциональной клавише F4 :

Однако я обнаружил, что исходная функция содержит небольшую ошибку, вызывающую следующее предупреждение, если F4 используется дважды для одного и того же файла, потому что vim путается при изменении времени модификации:

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

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

Вот измененная функция vim с этим исправлением ошибки, которую можно добавить в~/.vimrc:

function! WriteSmall()
    let mtime = system("stat -c %.Y ".shellescape(expand('%:p')))
    write
    call system("touch --date='@".mtime."' ".shellescape(expand('%:p')))
    edit
endfunction
map <F4> :call WriteSmall()<CR>

Примечание.:Эта функция основана на версиях GNU date, statи touch.

4
27.01.2020, 19:43

Теги

Похожие вопросы