Возьмем массив A
как
A=(h4 h5 h1 h2 h3)
Теперь проблема с командой sort
заключается в том, что она сортирует элементы в разных строках и не может сортировать элементы в одной строке. Таким образом, обходной путь состоит в том, чтобы преобразовать массив в элемент на строку и отсортировать с помощью sort
и поместить их в массив, который фактически отсортирован, то есть
B=(`echo ${A[@]} | tr " " "\n" | sort`)
Теперь B — отсортированный массив. Здесь tr
преобразует пробел в новую строку
Для переносимого создания файлов, которые вам нужны, и предполагая, что 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
.
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, и они придут на помощь во всех отношениях. Это то, чему действительно нужно уделить время, чтобы изучить и понять