Как распаковать только определенные файлы, которые следуют указанному шаблону?

При создании учетной записи создайте файл с именем ~ / .not_logged_in_yet . У него не обязательно должно быть какое-либо содержимое, файл просто должен существовать:

touch ~user/.not_logged_in_yet        # create the file
chown user ~user/.not_logged_in_yet   # should be owned by the user
chmod u+rw ~user/.not_logged_in_yet   # user must be able to delete it

Затем создайте сценарий с именем /etc/profile.d/check_first_login.sh , который содержит

#!/bin/bash
# only do this for interactive shells
if [ "$-" != "${-#*i}" ]; then
    if [ -f "$HOME/.not_logged_in_yet" ]; then
        echo "Welcome, this is your first login"
        rm "$HOME/.not_logged_in_yet"
    fi
fi

Когда вы входите в систему с bash в качестве оболочки оболочка будет исходным кодом / etc / profile (см. Файлы запуска Bash в руководстве). / etc / profile источники всех файлов *. Sh в /etc/profile.d/ , поэтому добавление файла делает его видимым для всех пользователей на ваша машина.

Вы хотите распечатать это сообщение, только если сеанс интерактивный . Печать чего-либо из вашего профиля может сломать вещи, которые должны быть не интерактивными (например, ssh-copy-id - хотя я не знаю, ломается ли это конкретно). Переменная bash $ - содержит некоторые настройки, установленные с помощью команды set :

$ bash -c 'echo $-; set -ex; echo $-'
hBc
+ echo ehxBc
ehxBc

Эта форма расширения параметра $ {- # * i} удаляет ведущая подстрока, оканчивающаяся на «i». $ - будет содержать "i" только в том случае, если это интерактивный сеанс bash, поэтому "$ -" не будет равно только "$ {i # * i} ", если сеанс интерактивный. Есть и другие способы проверить это: см. Эта оболочка интерактивна? - Я использовал этот метод, потому что это то, что делает / etc / profile.

2
23.03.2018, 02:06
3 ответа

Так как вы используете Bash, вы можете использовать его расширения фигурных скобок:

gunzip {20170307..20170314}*.gz

Если вы хотите только просмотреть содержимое файлов, добавьте -cпосле gunzip.

Если в последовательности отсутствуют файлы, gunzipсообщит об этом, но все равно обработает все файлы, которые присутствуют в последовательности. В этом случае также стоит отметить, что само расширение завершится ошибкой, если установлен параметр оболочки failglob, но это не значение по умолчанию в Bash.

4
27.01.2020, 21:52

find подход:

find. -maxdepth 1 -type f -regextype posix-egrep \
-regex ".*/201703(0[7-9]|1[0-4]):[0-5][0-9]\.out\.gz$" -exec gunzip {} \;
1
27.01.2020, 21:52

gunzip -cбудет только записывать содержимое в стандартный вывод, а не распаковывать его.

Для ваших целей:

for a in {07..14}; do gunzip -c '201703'$a':02.out.gz'; done

2
27.01.2020, 21:52

Теги

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