Изменить дату файла, чтобы он был старше любого другого файла в определенной папке

Найдите в журнале запуска устройства pcm. Они должны нести некоторое указание на то, к чему они относятся.

Вы можете выбрать PCM-устройство, которое хотите использовать, установив sysctl:
hw.snd.default_unit
на правильный номер ПКМ. Это должно тогда прыгнуть в жизнь.

0
18.07.2019, 02:01
4 ответа

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

#find the eldest file in dir
eldest=$(ls -t dir | tail -1)

#duplicate the time
touch -r "dir/$eldest" myfile

#make the file one second older
touch -A -000001 myfile
1
28.01.2020, 02:22

Вы можете получить метки времени с помощью findс -printfили с помощью statи отсортировать их, чтобы получить самые старые. Затем вычтите то, что вы хотите, и используйте его в качестве спецификации даты для touch. findимеет тот недостаток, что печатает доли секунды, которые необходимо удалить для расчета.

oldest=$(stat -c "%Y" dir/*|sort|head -1)
touch -d "@$((oldest-1))" dir/file
# or touch -d "@$((oldest-60))" file # subtract 1 min to see the difference in normal ls -l output.

Синтаксис даты -d @seconds-since-epochподдерживается GNU touch. Это не указано в POSIX.

Команда statне указана в POSIX, она является частью GNU coreutils, см.https://stackoverflow.com/questions/27828585/posix-analog-of-coreutils-stat-command.

Таким образом, это решение должно работать в системах Linux, но, возможно, не в обычных системах UNIX.

2
28.01.2020, 02:22

При переносе вам придется использовать perlдля сбора временных меток, вычитания необходимого количества времени, а затем форматировать его для touch.

t=$(perl make-oldest 1 dir/*)
if [ "$t" -gt 0 ]
then
  touch -t "$t" file
else
  echo "Sorry, unable to find a file!"
fi

... и самым старым perl-скриптом make -является:

#!/usr/bin/perl -w
use strict;
use POSIX qw(strftime);

my $subtract = shift;
my $oldest = 0;
for (@ARGV) {
  my @s = stat;
  next unless @s;
  if ($oldest) {
    $oldest = $s[9] if $s[9] < $oldest;
  } else {
    $oldest = $s[9];
  }
}

if ($oldest) {
  # convert ($oldest - $subtract) into CCCCYYMMDDhhmm.SS
  print strftime "%Y%m%d%H%M.%S\n", localtime($oldest - $subtract);
} else {
  print "0\n";
}

Цель состоит в том, чтобы ваша оболочка расширила подстановочный знак dir/*, чтобы получить список имен файлов. У perl-скрипта есть «два» аргумента :: количество секунд, которое нужно вычесть из самого старого файла, и список файлов, из которых нужно собрать временные метки.

Perl-скрипт получает аргумент вычитания, затем циклически перебирает заданные файлы и отслеживает время самой старой модификации. Если он не может прочитать какие-либо файлы, он вернет ноль (, как проверено скриптом-оболочкой выше ). Если был найден самый старый файл,затем мы используем функцию strftimeдля преобразования вычитаемой метки времени в соответствующий формат для touch.

0
28.01.2020, 02:22

Требуется трехэтапное решение:

  1. извлечь самую старую метку времени (только из файлов, а не из каталогов):

    $ oldestfile=$(find path/to/dir/ -maxdepth 1 -type f -printf '%A@ %f\n' | sort -rn | head -n 1)
    
  2. извлечь имя файла (удалить метку времени):

    $ oldestfile="${oldestfile#* }"
    
  3. коснитесь (GNU )файл на правильное время:

    $ touch -r "$oldestfile" -d '-1 min' "file"
    

Это создаст файл с именем file(, если он не существует )на 1 минуту старше, чем самый старый файл (, за исключением каталогов )в path/to/dir/.

0
28.01.2020, 02:22

Теги

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