использование подстановки команд в цикле bash for

Я нашел приведенный ниже идентификатор linux -caller -, и если бы он работал, он идеально подходил бы для моих нужд. Но он не работает под Mint 19, и в исходниках нет марки. Вздох.

0
05.04.2021, 17:43
2 ответа

Эта часть не имеет смысла:

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 с помощью ., эффективно генерирующего вашу временную метку.

3
28.04.2021, 22:53

@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/

0
28.04.2021, 22:53

Теги

Похожие вопросы