Найдите в журнале запуска устройства pcm
. Они должны нести некоторое указание на то, к чему они относятся.
Вы можете выбрать PCM-устройство, которое хотите использовать, установив sysctl:hw.snd.default_unit
на правильный номер ПКМ. Это должно тогда прыгнуть в жизнь.
Вы можете сделать это с помощью двухэтапного -процесса :скопировать метку времени, а затем изменить ее, чтобы она была старше:
#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
Вы можете получить метки времени с помощью 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.
При переносе вам придется использовать 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
.
Требуется трехэтапное решение:
извлечь самую старую метку времени (только из файлов, а не из каталогов):
$ oldestfile=$(find path/to/dir/ -maxdepth 1 -type f -printf '%A@ %f\n' | sort -rn | head -n 1)
извлечь имя файла (удалить метку времени):
$ oldestfile="${oldestfile#* }"
коснитесь (GNU )файл на правильное время:
$ touch -r "$oldestfile" -d '-1 min' "file"
Это создаст файл с именем file
(, если он не существует )на 1 минуту старше, чем самый старый файл (, за исключением каталогов )в path/to/dir/
.