Создание файлов в сценарии оболочки

Возьмем массив Aкак

A=(h4 h5 h1 h2 h3)

Теперь проблема с командой sortзаключается в том, что она сортирует элементы в разных строках и не может сортировать элементы в одной строке. Таким образом, обходной путь состоит в том, чтобы преобразовать массив в элемент на строку и отсортировать с помощью sortи поместить их в массив, который фактически отсортирован, то есть

B=(`echo ${A[@]} | tr " " "\n" | sort`)

Теперь B — отсортированный массив. Здесь trпреобразует пробел в новую строку

-2
08.03.2021, 14:08
2 ответа

Для переносимого создания файлов, которые вам нужны, и предполагая, что YYYYMMDDHHMMдолжен быть текущим годом, месяцем, днем, часом и минутой, вы должны использовать цикл в оболочке:

#!/bin/sh

destdir=${1:-.}

cd "$destdir" || exit 1

now=$( date +%Y%m%d%H%M )

i=0
while [ "$i" -lt 100 ]; do
    i=$(( i + 1 ))
    touch "Test1$now$i.txt"
done

cd "$destdir" || exit 1изменит текущий каталог на любой путь к каталогу, на который ссылается $destdir, или завершит сценарий, если это невозможно. Переменная destdirберет свое значение из первого аргумента в командной строке скрипта или, если аргумент не указан, будет ., т. е. текущим каталогом. Чтобы создать файлы в ~/somedir, вы должны запустить этот скрипт как ./script ~/somedir.

Это сначала устанавливает значение nowкак строковое представление нужной отметки времени. Затем он повторяется 100 раз и создает ваши файлы с помощью команды touchс отметкой времени и переменной-счетчиком i.


В оболочке bashвы, вероятно, захотите использовать расширение фигурной скобки, чтобы заменить цикл выше. Это выполнимо, если общая длина командной строки генерации не слишком велика. Если он станет слишком длинным, чего не будет для 100 файлов, вы получите ошибку «слишком длинный список аргументов», и вам придется прибегнуть к чему-то вроде цикла, описанного выше.

Вы также можете использовать специальную строку формата %(...)Tсо встроенной утилитой -в printfв bashвместо вызова утилиты date. Для этого требуется bashверсии 4.2 или выше.

#!/bin/bash

destdir=${1:-.}

cd "$destdir" || exit 1

printf -v now '%(%Y%m%d%H%M)T' -1

touch "Test1$now"{1..100}.txt

Если вам нужно создать много тысяч файлов, что приведенный выше код не позволяет вам сделать, и если вы очень не любите циклы (или просто любите писать нечитабельно и необслуживаемый код ),то вам может помочь команда xargs:

#!/bin/bash

destdir=${1:-.}

cd "$destdir" || exit 1

printf -v now '%(%Y%m%d%H%M)T' -1

printf 'Test1%s.txt\n' "$now"{1..100} | xargs touch

Это вызовет утилиту touchчерез xargs, которая прочитает аргументы из printfи создаст файлы управляемыми пакетами, а не все сразу. Не будет проблем с вызовом утилиты printfсо всеми именами файлов, поскольку printfявляется встроенной утилитой -.


В оболочке zsh, если вы хотите отличаться, вы можете сделать что-то вроде

#!/bin/zsh

destdir=${1:-.}

cd $destdir || exit 1

zmodload zsh/datetime

strftime -s now %Y%m%d%H%M

i=0
repeat 100 touch Test1$now$((++i)).txt

Очевидно, что вы также можете использовать обычное раскрытие фигурных скобок с zsh, но выше показано, как использовать упрощенный вариант цикла zshс repeat.

4
18.03.2021, 22:27
mkdir Test1$(date +%Y%m%d%H%M){1..100}
touch Test1$(date +%Y%m%d%H%M){1..100}.txt

Это создаст 100 каталогов, см. справочную страницу для даты, а также проверит раскрытие скобок в bash. Это вещи, с которыми вы работаете здесь.

Команда touchсделает то же самое, но создаст файлы.

Эти идеи можно использовать во множестве команд в bash, и они придут на помощь во всех отношениях. Это то, чему действительно нужно уделить время, чтобы изучить и понять

3
18.03.2021, 22:27

Теги

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