#bash #shell
#bash #оболочка
Вопрос:
Для определенных каталогов я должен нумеровать файлы в зависимости от времени изменения, поэтому используйте следующую однострочную строку Bash:
i=1;
for f in $(ls -t); do
stripped=$(echo $f | sed 's/^([[:digit:]] -|)//g');
counter=$(printf "dn" $i);
mv "$f" "$counter-$stripped";
i=$(($i 1));
done
Результат будет примерно таким
file_a -> 0000001_file_a
file_b -> 0000002_file_b
file_c -> 0000003_file_c
Но если я выполняю преобразования для некоторых файлов (например, с помощью ffmpeg
), то время изменения изменяется, и это приведет к нарушению порядка при возвращении к этому позже.
Как можно сохранить все время изменения?
Ответ №1:
Решение touch
( touch -r
если быть точным; см. man touch
Вывод ниже):
for orig_file in *m4a; do
ffmpeg -i "${orig_file}" "${orig_file}.wav";
touch -r "${orig_file}" "${orig_file}.wav";
rm $x; /
done
Итак, вместо ls -t
вывода
0000001_file_a.wav
0000002_file_b.m4a
0000003_file_c.wav
становится таким после преобразования,
0000002_file_b.m4a.wav
0000001_file_a.wav
0000003_file_c.wav
он останется прежним (только с другим расширением):
0000001_file_a.wav
0000002_file_b.m4a.wav
0000003_file_c.wav
touch
Используется только для создания новых файлов, но, как выясняется, его основная цель — нечто совершенно другое; из man touch
:
NAME
touch - change file timestamps
SYNOPSIS
touch [OPTION]... FILE...
DESCRIPTION
Update the access and modification times of each FILE to the
current time.
A FILE argument that does not exist is created empty, unless -c
or -h is supplied.
A FILE argument string of - is handled specially and causes
touch to change the times of the file associated with standard
output.
Mandatory arguments to long options are mandatory for short op‐
tions too.
-a change only the access time
-c, --no-create
do not create any files
-d, --date=STRING
parse STRING and use it instead of current time
-f (ignored)
-h, --no-dereference
affect each symbolic link instead of any referenced file
(useful only on systems that can change the timestamps
of a symlink)
-m change only the modification time
-r, --reference=FILE
use this file's times instead of current time
-t STAMP
use [[CC]YY]MMDDhhmm[.ss] instead of current time
--time=WORD
change the specified time: WORD is access, atime, or
use: equivalent to -a WORD is modify or mtime: equiva‐
lent to -m