Правильно процитированная строка должна выглядеть так:
$ echo \*/2\ \*\ \*\ \*\ \*\ /usr/bin/aws\ ssm-send-command\ --document-name\ \"AWS-RunShellScript\"\ --parameters\ \'\{\"commands\":\[\"echo\ \{\{ssm:/mr2/cloudwatch-custom\}\}\"\]\"\}\'\ --instance-ids\ \"\$INSTANCE_ID\"\ --region\ us-east-1
Конечно, я не сам придумал это безумное цитирование, я использовал этот скрипт, который использует спецификатор %q
:
#!/usr/bin/env sh
read
printf "%q\n" "$REPLY" | tr '\n' ' '
Зачем использовать массивы, циклы или awk
, когда есть встроенные инструменты, такие как uniq
с опцией-w
(Версия GNU )?
mv $(ls *csv|uniq -w 10) /home/vikrant_singh_rana/uniquefiles/
С zsh
.
typeset -A files
for f (*_*_*.csv(.On)) files[${(M)f#*_*_}]=$f
mv -- $files target-directory/
Квалификатор .
glob ограничивает обычными файлами, в то время как On
сортирует в обратном порядке, так что в конце ассоциативный массив содержит первый файл в алфавитном порядке для данного ключа (здесь часть до второй_
).
Вместо лексического порядка вы можете o
упорядочить по m
времени модификации вместо (считать, что 100001_XYZ_01Oct2020_0000-01Oct2020_0100
будет раньше 100001_XYZ_30Sep2020_2200-30Sep2020_2300
, например, в лексическом порядке ), по заменив On
на om
(, который сортирует файлы от самых новых до самых старых ), так что в конечном итоге вы перемещаете самый старый файл, а не тот, который идет первым в лексическом порядке.
Или вы можете определить порядок сортировки на основе первой метки времени в имени файла:
zmodload zsh/datetime
bydate() strftime -rs REPLY %d%b%Y_%H%M ${${REPLY%-*}#*_*_}
И используйте nO+bydate
вместо On
/om
.
С bash
и инструментами GNU вы могли бы сделать что-то близкое к (, не ограничиваясь обычными файлами, и без сортировки по времени модификации, хотя )с:
shopt -s failglob
printf '%s\0' *_*_*.csv | sort -zsmut_ -k1,2 | xargs -r0 mv -t target-dir --
(все -z
, -s
, -r
, -0
, -t
являются расширениями GNU ).
Сортировка по отметке времени, извлеченной из имен файлов, может быть выполнена с помощью:
printf '%s\0' *_*_*.csv |
# key year month day HHMM
LC_ALL=C sort -zt_ -k1,2 -k3.6,3.9n -k3.3,3.5M -k3.1,3.2n -k3.11,3.14n |
LC_ALL=C sort -zsmut_ -k1,2 |
xargs -r0 mv -t target-dir
Если в качестве клавиши вам нужна часть между первым и вторым вхождением _
, замените ${(M)f#*_*_}
на${${f#*_}%%_*}
(или${${(s[_])f}[2]}
)или -k1,2
на -k2,2
.
Я бы просто использовал массив для хранения имен, которые вы видели, и перемещал бы только «новые» имена:
declare -A seen=()
name_seen='seen[$name]++' # work around to avoid ACE vulnerability
for i in /home/vikrant_singh_rana/unzipfiles/*_*_*; do
name=${i##*/} # remove directory part
name=${name%"_${name#*_*_}"} # retain first two fields
(( name_seen )) || mv -- "$i" /home/vikrant_singh_rana/uniquefiles/
done