- bash переименование
- Renaming a bunch of files with date modified timestamp at the end of the filename?
- 5 Answers 5
- Update 2021-03-20
- Linux переименовать файл дату
- Переименование в текущую дату (rename to data name)
- Переименование в текущую дату (rename to data name)
- Переименование в текущую дату (rename to data name)
- Переименование в текущую дату (rename to data name)
- Переименование в текущую дату (rename to data name)
- Переименование в текущую дату (rename to data name)
bash переименование
Прошу быть аккуратнее, не портируемо на FreeBSD и не тестировано.
mv файл.jpg файл_$(stat -c %y файл.jpg | cut -d ' ' -f1)
stat -c %y файл.jpg | cut -d ' ' -f1
А чтобы получить вывод одной команды как аргумент для другой, надо поместить ее в такие скобки:
Для нескольких файлов IMHO все равно надо скрипт писать. Что-то в таком духе
#!/bin/bash cd tst for i in * do sfx='' tim=`stat -c %Y $i` dt=`date +_%d-%m-%y--%T --date=@$tim` # echo $i if echo $i | grep -sq '\.' ; then sfx=`echo $i | sed 's/.*\.//'` base=`echo $i | sed s/$sfx\$// | sed 's/\.$//'` # echo sfx=$sfx base=$base fi if [ "$sfx" == "" ] ; then echo mv $i $$dt else echo mv $i $base$dt.$sfx fi done
Вы посмотрите man date и подпрвьте форматы, как Вам будет удобней (ну и echo из echo mv . , естественно, уберите).
Сейчас у меня тестовый вывод вот такой:
avp@avp-xub11:hashcode$ ./rename.sh mv a a_28-09-12--18:27:10 mv aaa.bbb.ccc aaa.bbb_20-05-15--13:57:58.ccc mv f1 f1_28-09-12--16:40:19 mv f2 f2_28-09-12--16:40:19 mv f3 f3_28-09-12--16:40:19 mv f.txt f_28-09-12--18:49:25.txt mv guessfrom.c guessfrom_24-09-12--00:08:13.c mv libxaxa.so libxaxa_23-09-12--23:21:21.so mv my-prog.tar my-prog_23-09-12--23:25:49.tar mv prog prog_23-09-12--23:23:34 mv Readme.txt Readme_24-09-12--00:52:06.txt mv rxaxa rxaxa_24-09-12--00:08:57 mv rxaxa.c rxaxa_23-09-12--23:52:25.c mv txaxa.c txaxa_23-09-12--23:00:58.c mv xaxa xaxa_23-09-12--23:21:55 mv xaxa.c xaxa_23-09-12--23:00:41.c avp@avp-xub11:hashcode$
Renaming a bunch of files with date modified timestamp at the end of the filename?
So, say, I have a directory with a bunch of files like g.txt, where g.txt was last modified on, say, June 20, 2012. How would I batch-rename all of the files (like g.txt) with the last modified date of June 20, 2012 appended on the end?
5 Answers 5
here’s a version of goldschrafe’s one-liner that:
- doesn’t use stat
- works with earlier versions of GNU date
- correctly copes with any spaces in the filenames
- also copes with filenames beginning with a dash for f in *; do mv — «$f» «$f-$(date -r «$f» +%Y%m%d)»; done
Update 2021-03-20
My answer to this question has been bothering me for years (well, only when I remember it — on days like today when it gets another upvote) so I’m finally updating it. My original answer above still works, but the updated answer below is better.
Like any batch file renaming operation, this should be done with the perl rename utility, not with some klunky shell for loop.
The perl rename utility is effectively a specialised scripting language that allows you to use ANY perl code to rename files, from simple s/search/replace/ regular expression operations (which suffices for most renaming tasks) to complex multi-line scripts.
rename -n 'BEGIN ; die $! unless -f $_; next if (m/-\d$/); my $ts=(stat($_))[9]; my $dt=time2str("%Y%m%d",$ts); s/$/-$dt/;' *.txt
This requires only perl and the Date::Format module (a module that is so useful that it should be installed on any system with perl. IMO it, along with the author Graham Barr’s Date::Parse module, should be part of perl’s core module library but it isn’t so you’ll have to install it with cpan or a distro package like Debian’s libtimedate-perl package).
BTW, this script skips any file that looks like it already has a date (i.e. 8 digits) at the end of the filename.
or, for a fancier version that puts the date before the file’s suffix (if any):
rename -n 'BEGIN ; die $! unless -f $_; my ($filename,$dirs,$suffix) = fileparse($_,qr/\.[^.]*/); next if (m/-\d$$/); my $ts=(stat($_))[9]; my $dt=time2str("%Y%m%d",$ts); s/$$/-$$/;' *.txt
This version has no extra requirements because the File::Basename module has been included as a standard core module with perl for as long as I can remember (a decade at least, probably longer).
Note: both rename scripts above use rename’s -n (aka —nono ) «dry-run» option so that the results can be tested/simulated before being applied. Remove the -n (or replace it with -v for verbose output) when you’re sure that it does what you want.
Also Note: as with any other perl rename script, this can rename filenames supplied on the command line and/or from standard input. e.g. to rename all .txt files in the current directory and all sub-directories:
find . -type f -iname '*.txt' -print0 | rename -0 --nofullpath -n '. '
BTW, I have used rename ‘s —nofullpath (aka -d , —filenmame , —nopath ) option here to ensure that it renames only the filename portion of any filepaths found. It’s not needed in this particular case (because the example rename scripts only change the end of the filename) but is generally a good idea when you don’t want to rename the path as well as the filename (e.g. a rename script like ‘s/ //g’ to strip spaces from filenames would try to remove any spaces in the path as well as the filename without —nofullpath , probably causing it to fail with an error).
Finally: do not confuse the perl rename script (aka File::Rename , or sometimes called prename on Fedora & RedHat, or perl-rename ) with any other program called rename. Only this perl-based rename utility can rename files using arbitrary perl code as shown above, any other rename utility will have different capabilities and different & incompatible command-line options.
You can check if you have the right rename installed:
$ rename -V /usr/bin/rename using File::Rename version 1.13, File::Rename::Options version 1.10
The executable might be called prename or perl-rename or file-rename on your system, so try -V with those, and adjust the examples above to use the correct executable name.
Linux переименовать файл дату
#!/bin/bash DIR_IN="input" DIR_OUT="output" if [ ! -d "$DIR_IN" -o ! -d "$DIR_OUT" ] then exit 1 fi find "$DIR_IN" -mindepth 1 -type f | while read FILE do FILE_NAME=$(basename "$FILE") unset FILE_SUFFIX if [[ "$FILE_NAME" == *.* ]] then FILE_SUFFIX=".$" fi mv "$FILE" "$DIR_OUT/$(date --date="$(stat --printf=%y "$FILE")" +%d-%m-%Y)$FILE_SUFFIX" done
Для переименования с временной меткой mv «$FILE» «$DIR_OUT/$(date —date=»$(stat —printf=%y «$FILE»)» +%H:%M_%d-%m-%Y)$FILE_SUFFIX»
Новичок? — ознакомься с правилами
и Панель форматирования
IRC-канал
zuzabrik Сообщения: 1744 Зарегистрирован: 29 авг 2016, 12:08 Решено: 20 Благодарил (а): 108 раз Поблагодарили: 521 раз Контактная информация:
Переименование в текущую дату (rename to data name)
во первых смущает как он будет работать со скрытыми файлами (*.* шаблон вроде и их включает)
во вторых раз уж есть операция добавления даты, хотелось бы и скрипт обратного преобразования. из файла+дата к файлу
Chocobo Сообщения: 10010 Зарегистрирован: 27 авг 2016, 22:57 Решено: 215 Откуда: НН Благодарил (а): 812 раз Поблагодарили: 3000 раз Контактная информация:
Переименование в текущую дату (rename to data name)
Dja Сообщения: 6635 Зарегистрирован: 27 авг 2016, 20:03 Решено: 28 Откуда: Voskresensk Благодарил (а): 1188 раз Поблагодарили: 699 раз Контактная информация:
Переименование в текущую дату (rename to data name)
Chocobo , имени файла конечно
zuzabrik , переименовывание того файла, который надо переименовать. Как правило это логи или бэкапы. А эти файлы видимы. Невидимый файл туда случайно не попадет. Если не нужна дата, а нужен файл — то просто не переименовываешь.
Новичок? — ознакомься с правилами
и Панель форматирования
IRC-канал
Chocobo Сообщения: 10010 Зарегистрирован: 27 авг 2016, 22:57 Решено: 215 Откуда: НН Благодарил (а): 812 раз Поблагодарили: 3000 раз Контактная информация:
Переименование в текущую дату (rename to data name)
Ты ж любишь везде конкретику — вот и тут стоило бы расписать, что это переименование — является переносом файлов из папки ./input в папку ./output с попутным изменением имени на дата+имяфайла
P.S. input / output лучше бы ключами запуска передавать, как и возможность выбора между дата и датавремя
zuzabrik Сообщения: 1744 Зарегистрирован: 29 авг 2016, 12:08 Решено: 20 Благодарил (а): 108 раз Поблагодарили: 521 раз Контактная информация:
Переименование в текущую дату (rename to data name)
Dja писал(а): переименовывание того файла, который надо переименовать. Как правило это логи или бэкапы. А эти файлы видимы. Невидимый файл туда случайно не попадет. Если не нужна дата, а нужен файл — то просто не переименовываешь.
Я бы посоветовал просто архивировать логи или бекапы и давать дату архиву, а не файлам. Потому и спросил про обратное переименование. Очень интересно просто как забекапив таким образом например папку doc с сотней документов в нем ты распакуешь их обратно. будешь у каждого файла вручную убирать дату создания архива? Или не дай бог архивировать так системные папки, типа /etc
Уж лучше нечто типа такого. Создает из содержимого заданых папок архив с датой. Распаковать его обратно не сложно, а вот переименовать обратно все файлы чтобы вернуть в систему, задачка не такая тривиальная. Особенно если файлы в своем названии уже содержали дату до вставки текущей даты.
#!/bin/bash FILES="bin Видео Документы Загрузки Изображения Музыка Общедоступные Шаблоны" cd .. tar -czvf ./backup/backup_$(date +%Y-%m-%d_%H-%M-%S).tar.gz $FILES
colonel Сообщения: 1851 Зарегистрирован: 18 дек 2016, 12:08 Решено: 21 Откуда: Хартленд, N Благодарил (а): 43 раза Поблагодарили: 498 раз Контактная информация:
Переименование в текущую дату (rename to data name)
zuzabrik писал(а): Я бы посоветовал просто архивировать логи или бекапы и давать дату архиву, а не файлам
файлы . фуяйллы папки . архивы .
Понятно что лучше конечн архивом бекапить и добавить в имя архивируемого файла или папки дату\время нет проблем
zuzabrik писал(а): во вторых раз уж есть операция добавления даты, хотелось бы и скрипт обратного преобразования. из файла+дата к файлу
а вот это ужо точно засада
но коль вопрос стоит — «переименовывание того файла, который надо переименовать»
то .
собсно вот скриптик —
вставить в него и другой формат даты-времени ( и если надо то и архивирование добавить и тд. итп ) , не должно составить труда.
а так. если его в скрипты ФМ зафигачить
то ПКМ по выбранному файлу в Контекстном меню -> Сценарии -> (ентот скриптик ) и .
выделенный(выбранный кликом при ПКМ) файлик или папка будут переименованы добавлением текущего даты-времени перед собсно именем файла.
ну и там истчшо сообщение должоно выскочить о проведённом переименовании.
И если дальше извращаться , то можно подумать и как сделать чтоб кучей переименовывать . в каталоге или несколько выделенных .
конечно это не полное переименование имени в дату(как было говорено в начале темы), зато нет проблем с обратным преобразованием и поиском имени которое было до переименования в дату.