Как сохранить время изменения файлов после преобразования их в другой формат (например, M4A в WAV)?

#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