выбирать и перемещать уникальные файлы на основе некоторого шаблона

Правильно процитированная строка должна выглядеть так:

$ 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' ' '
2
16.10.2020, 16:36
3 ответа

Зачем использовать массивы, циклы или awk, когда есть встроенные инструменты, такие как uniqс опцией-w(Версия GNU )?

mv $(ls *csv|uniq -w 10) /home/vikrant_singh_rana/uniquefiles/
3
18.03.2021, 22:56

С 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.

6
18.03.2021, 22:56

Я бы просто использовал массив для хранения имен, которые вы видели, и перемещал бы только «новые» имена:

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
4
18.03.2021, 22:56

Теги

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