Существует возможность скопировать метку времени из другого файла.
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
Для полноты картины, а также благодаря простой структуре имен ваших файлов и целевых каталогов следующая команда find
перебирает все файлы глав и перемещает их в целевой каталог, имя которого происходит от имени файла:
find. -maxdepth 1 -type f -name 'chapter*_section*.odf' -exec bash -c 'f={}; d="book/${f%_*}"; mv "$f" "$d"' \;
Это будет (неявно )перебирать все файлы, соответствующие chapter*_section*.odf
, и выполнять команду оболочки, которая извлекает имя целевого каталога, удаляя последний компонент _*
из имени файла, эффективно оставляя только chapterN
часть. Затем он переместит обрабатываемый файл в соответствующий подкаталог в book/
.
Примечание
-maxdepth 1
необходим для обеспечения того, чтобы операция выполнялась только над файлами в текущем каталоге, а не рекурсивно над теми, которые уже были перемещены в свои целевые каталоги после обработки текущего каталога. {}
в команду оболочки, вызываемую через -exec
, не рекомендуется , но будет работать, если вы не предполагаете попыток внедрения вредоносного кода. Без использования цикла for
? Вы можете использовать утилиту perl rename
(, также известную как prename
, file-rename
или perl-rename
в некоторых дистрибутивах ), чтобы создать подкаталоги и переименовать в них файлы. Например:
$ rename -v 'BEGIN{mkdir "book"};
if (m/chapter(\d+)/) {
my $d="book/chapter$1";
mkdir $d;
$_ = "$d/$_"
}' *
chapter1.txt renamed as book/chapter1/chapter1.txt
chapter2.txt renamed as book/chapter2/chapter2.txt
chapter3.txt renamed as book/chapter3/chapter3.txt
chapter4.txt renamed as book/chapter4/chapter4.txt
chapter5.txt renamed as book/chapter5/chapter5.txt
Резюме сценария на английском языке:
Если текущее имя файла($_
)соответствует регулярному выражению chapter(\d+)
, извлеките номер главы из имени файла (, т.е. $1
, которое является первой и единственной группой захвата в регулярном выражении, (\d+)
), создайте каталог для главы, а затем переименуйте текущий файл в каталог.
Не соответствующие -имена файлов игнорируются.
perl rename
пытается переименовать файл только в том случае, если скрипт переименования изменяет значение $_
. Он также отказывается перезаписывать существующий файл, если только вы не вынуждаете его с помощью опции -f
.
perl rename позволяет вам использовать любой код perl в сценарии переименования (, но обратите внимание, что действует прагма use strict
, поэтому вам нужно объявить свои переменные ). Если код изменится $_
, файл будет переименован. Если нет, то не будет.
Обратите внимание, что хорошей практикой является выполнение сначала пробного -запуска с опцией -n
, чтобы убедиться, что переименование будет делать то, что вы хотите, (восстановление после неудачного массового переименования может быть серьезной проблемой. ПИТА ). -n
не переименовывает никакие файлы, он просто показывает, что он сделал бы . Замените -n
на -v
(, как показано выше ), чтобы получить подробный вывод, или просто удалите -n
для бесшумной работы.
Я считаю утилиту mmv
удобной для подобных вещей:
$ mmv -v 'chapter*_section*.odf' 'book/chapter#1/'
chapter1_section1.odf -> book/chapter1/chapter1_section1.odf : done
chapter1_section2.odf -> book/chapter1/chapter1_section2.odf : done
chapter1_section3.odf -> book/chapter1/chapter1_section3.odf : done
chapter1_section4.odf -> book/chapter1/chapter1_section4.odf : done
chapter2_section1.odf -> book/chapter2/chapter2_section1.odf : done
chapter2_section2.odf -> book/chapter2/chapter2_section2.odf : done
chapter2_section3.odf -> book/chapter2/chapter2_section3.odf : done
chapter2_section4.odf -> book/chapter2/chapter2_section4.odf : done
давать
$ tree book
book
├── chapter1
│ ├── chapter1_section1.odf
│ ├── chapter1_section2.odf
│ ├── chapter1_section3.odf
│ └── chapter1_section4.odf
└── chapter2
├── chapter2_section1.odf
├── chapter2_section2.odf
├── chapter2_section3.odf
└── chapter2_section4.odf
2 directories, 8 files