Я нашел приведенный ниже идентификатор linux -caller -, и если бы он работал, он идеально подходил бы для моих нужд. Но он не работает под Mint 19, и в исходниках нет марки. Вздох.
Эта часть не имеет смысла:
ls $file | $(something)
Формат $(command)
означает «запустить command
и рассматривать его вывод как переменную». Это не то, что может принимать ввод по конвейеру. Я думаю, что вы имели в виду написать:
for file in *; do
var=$(ls "$file" | grep -Eo '.{18}$' | cut -d '.' -f1 |sed 's/.\{12\}/&./');
echo "var is $var. File is $file"
done
Однако для странных имен файлов это может привести к серьезным ошибкам. Вы действительно не хотите анализировать выводls
. Что еще более важно, ls
здесь абсолютно не нужен! У вас уже есть имя файла, поэтому ls
не добавляет ничего, кроме сложности и возможного источника ошибки. Это должно делать то, что вы хотите:
for file in *; do
timestamp=$(sed -E 's/.*(.{12})(..)\.[^.]*$/\1.\2/' <<<"$file")
touch -a -m -t "$timestamp" -- "$file"
done
sed
напечатает только последние 14 символов файла, которые идут перед окончательным расширением(\.[^.]*$/
будут соответствовать .
, а затем 0 или более не-.
до конца имени файла ), но отделяет последние 2 от предыдущих 12 с помощью .
, эффективно генерирующего вашу временную метку.
@terdon нет, спасибо за ваше любезное решение. Для других новичков в Linux. У меня также были некоторые проблемы с часовым поясом, поэтому окончательный результат:
for file in *; do
timestamp=$(sed -E 's/.*(.{12})(..)\.[^.]*$/\1.\2/') <<<"$file"
TZ=UTC-2 touch -a -m -t "$timestamp" -- "$file"
done
ps :Я использую этот сайт для анализа регулярного выражения:https://regex101.com/