Все это можно сделать как одно целое.
for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%Y%m%dT%H%M).${i##*.}"; done
Для литеральной метки времени , т.е. секунд с начала эпохи, можно просто использовать:
for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%s).${i##*.}"; done
Эта проверка безопасности предназначена только для работы с файлами, имена которых содержат точки; он правильно обрабатывает файлы с местами в именах; и предполагает (как это обычно бывает), что поле, разделяющее ПОСЛЕДНИЕ точки, является расширением, а не поле, разделяющее ПЕРВЫЕ точки, является именем файла, а остальное является расширением.
Зачет muru для бита -привязки
; Я не знал об этом варианте.
-121--70032-
печать :
printf :
Функция «printf ()» (отформатированная печать) намного гибче и сложнее. Имеет синтаксис
printf(,)
Разница :
Разница между printf и print является аргументом формата. Это выражение, значение которого принимается как последовательность; определяет способ вывода каждого из других аргументов. Она называется последовательностью формата.
-121--53989-
Этот фрагмент сценария оболочки создает расширенное регулярное выражение (с /
символами, которые соответствующим образом удалены), содержащее все дни с прошлого понедельника по следующее воскресенье, в формате YYYY/MM/DD
Затем с помощью grep
выполняется поиск в файле журнала.
DAYS=$(for D in {0..6} ; do
date -d "last monday + $D days" +'%Y\\/%m\\/%d'
done | xargs |
sed -e 's/ /|/g'
)
REGEX="^($DAYS) "
grep -E "$REGEX" logfile.txt
Если вы предпочитаете использовать базовые регулярные выражения, измените последние строки на:
REGEX="^\($DAYS\) "
REGEX=$(printf "%s" "$REGEX" | sed -e 's/\([|]\)/\\\1/g')
grep "$REGEX" logfile.txt
Другой вариант - использовать опции grep
-F
(фиксированная строка) и -f
(файл) с возможностью подстановки процесса оболочки , например:
DAYS=$(for D in {0..6} ; do
date -d "last monday + $D days" +'%Y/%m/%d'
done )
grep -F -f <(echo "$DAYS") logfile.txt
или даже
grep -F -f <( for D in {0..6} ; do
date -d "last monday + $D days" +'%Y/%m/%d'
done ) logfile.txt
ПРИМЕЧАНИЕ: эти последние две версии будут совпадать на дату в этом формате в любом месте строки, а не только в начале строки. с образцом, который вы дали, это вряд ли будет проблемой.
*.d
расширяется до файлов, имена которых заканчиваются на .d
.
С помощью zsh
можно сделать:
files=(*)
mkdir -- $^files.d
Или с анонимной функцией:
() { mkdir -- $^argv.d; } *
Или добавление суффикса через квалификатор e
glob:
mkdir -- *(e{REPLY+=.d})
Или модификатор истории :s
, примененный к глобусам (с histsubstpattern
для %
, означающим конец):
set -o histsubstpattern
mkdir -- *(:s/%/.d)
Вы также можете не делать этого для файлов, которые уже являются каталогами или символическими ссылками на каталоги, добавив квалификатор ^-/
glob:
files=(*(^-/))
mkdir -- $^files.d
(обратите внимание, что zsh
не имеет такой неправильной функции, как другие Bourne -, такие как оболочки, в которых шаблоны, которые не совпадают, передаются как -, поэтому mkdir *.d
не будет создавать каталог *.d
, если в текущем каталоге не было файла, соответствующего *.d
, вместо этого команда прервалась бы с ошибкой)
Вместо for foo in bar; do baz; done
решения я бы предложил:
find. -maxdepth 1 -type f -print0|xargs -0 -I file mkdir file.d
Подстановочный знак всегда расширяется до существующих имен.
Ваша команда mkdir *
не удалась, потому что имена, которые раскрываются *
, уже существуют.
Ваша команда mkdir *.d
"сбой", потому что *.d
не соответствует ни одному существующему имени. Таким образом, по умолчанию шаблон остается нераскрытым 1 и создается каталог с именем *.d
. Вы можете удалить это с помощью rmdir '*.d'
.
Создать каталог для каждого обычного файла в текущем каталоге, чтобы новые каталоги имели то же имя, что и файлы, но с суффиксом .d
:
for name in./*; do
if [ -f "$name" ]; then
# this is a regular file (or a symlink to one), create directory
mkdir "$name.d"
fi
done
или, для тех, кто любит "один -лайнеров",
for n in./*; do [ -f "$n" ] && mkdir "$n.d"; done
В bash
вы также можете сделать
names=(./* )
mkdir "${names[@]/%/.d}"
но это не проверяет, являются ли вещи, в которые расширяется glob, обычными файлами или чем-то еще.
Начальный ./
в приведенных выше командах предназначен для защиты от имен файлов, содержащих начальный дефис(-
)в именах файлов. В противном случае тире и символы, следующие за ним, интерпретировались бы как опции для mkdir
.
1Некоторые оболочки имеют опцию оболочки nullglob
, которая приводит к тому, что не совпадающие -подстановочные знаки оболочки заменяются пустой строкой. В bash
это включается с помощью shopt -s nullglob
.