поиск и удаление условного файла

BitMeter OS - это монитор с открытым исходным кодом с функциями, подобными Networx. Он имеет веб-интерфейс и интерфейс командной строки. Он также имеет экспериментальный клиент для настольных компьютеров. Пакеты «.deb» можно загрузить с http://codebox.org.uk/pages/bitmeteros/downloads и установить с помощью установщика пакетов gdebi или из командной строки с использованием (64-разрядной версии)

$ sudo dpkg -i bitmeteros_0.7.6-amd64.deb

Для получения дополнительной информации о приложении см. http://codebox.org.uk/pages/bitmeteros/downloads .

1
задан 21 November 2017 в 04:30

8 ответов

[F1]
1
ответ дан 18 July 2018 в 02:55

Вы также можете использовать язык без оболочки для этой задачи:

ruby -e ' files = Dir.glob("*") groups = files.group_by {|f| f.sub(/_.*/, "")} groups.each_value {|flist| File.delete(*flist) if flist.length < 15} '

или

perl -e ' foreach $f (glob "*") { ($prefix = $f) =~ s/_.*//; push @{$groups{$prefix}}, $f; } foreach $flist (values %groups) { unlink @$flist if (scalar @$flist < 15); } '
0
ответ дан 18 July 2018 в 02:55

Еще один возможный ответ:

$ declare -A pref ; for f in *_[0-9]*.jpg ; do p=${f%_*} ; (( pref[$p]++ )); done ; for p in "${!pref[@]}" ; do (( ${pref[$p]} < 15 )) && rm "$p"_* ; done
0
ответ дан 18 July 2018 в 02:55

Untested, но вы можете сделать что-то вроде:

printf "%s\n" *.jpg | cut -d_ -f1 | sort -u | while IFS= read -r prefix; do files=( "$prefix"*.jpg ) if [[ "${#files[@]}" -ne 15 ]]; then echo rm "$prefix"* fi done

. Он находит список уникальных префиксов и, для каждого, помещает список файлов в массив: если размер массива не 15, а затем удалить.

3
ответ дан 18 July 2018 в 02:55
[F1]
1
ответ дан 24 July 2018 в 17:41
  • 1
    от канала #linux IRC! Благодаря! – Mona Jalal 20 November 2017 в 23:35
  • 2
    Вместо того, чтобы полагаться на ls, вы можете попросить оболочку посмотреть, существует ли этот файл: if [[ ! -f "${bla:0:7}_14.jpg" ]]; then ... – glenn jackman 20 November 2017 в 23:36
  • 3
    >/dev/null 2>&1 в bash соответствует &>/dev/null. – dessert 20 November 2017 в 23:40
  • 4
    Следует отметить, что echo необходимо удалить после тестирования, чтобы выполнить удаление. – dessert 20 November 2017 в 23:42
  • 5
    эй, я просто понял, что это не удаление файлов, а только эхо, которое удаляется, но это не так. Как это исправить? – Mona Jalal 21 November 2017 в 00:19

Вы также можете использовать оболочку языка для этой задачи:

ruby -e ' files = Dir.glob("*") groups = files.group_by {|f| f.sub(/_.*/, "")} groups.each_value {|flist| File.delete(*flist) if flist.length < 15} '

или

perl -e ' foreach $f (glob "*") { ($prefix = $f) =~ s/_.*//; push @{$groups{$prefix}}, $f; } foreach $flist (values %groups) { unlink @$flist if (scalar @$flist < 15); } '
0
ответ дан 24 July 2018 в 17:41

Еще один возможный ответ:

$ declare -A pref ; for f in *_[0-9]*.jpg ; do p=${f%_*} ; (( pref[$p]++ )); done ; for p in "${!pref[@]}" ; do (( ${pref[$p]} < 15 )) && rm "$p"_* ; done
0
ответ дан 24 July 2018 в 17:41

Untested, но вы можете сделать что-то вроде:

printf "%s\n" *.jpg | cut -d_ -f1 | sort -u | while IFS= read -r prefix; do files=( "$prefix"*.jpg ) if [[ "${#files[@]}" -ne 15 ]]; then echo rm "$prefix"* fi done

. Он находит список уникальных префиксов и, для каждого, помещает список файлов в массив: если размер массива не 15, а затем удалить.

3
ответ дан 24 July 2018 в 17:41
  • 1
    Вы имеете в виду «если размер массива не 15, тогда удалите», не так ли? Вы должны упомянуть, что echo необходимо удалить после тестирования, это может быть не очевидно всем. – dessert 20 November 2017 в 23:46
  • 2
    это также не удаляло файлы. Он просто перекликается с тем, что он удаляет файлы. – Mona Jalal 21 November 2017 в 01:54
  • 3
    @Mona предположительно, что вы можете безопасно протестировать скрипт, не удаляя ваши файлы, вы просто удалите echo после того, как вы протестировали скрипт и увидели, что он работает – Olorin 21 November 2017 в 03:12
  • 4
    Мудрое примечание. Спасибо за объяснение – Mona Jalal 21 November 2017 в 03:13
  • 5
    @MonaJalal * должно быть вне кавычек, я исправил это сейчас. @ glen - возможно, вы можете использовать uniq -c и сделать подсчет бесплатным? Прямо сейчас вы трижды забиваете - один раз для printf, один раз для подсчета, один раз для удаления. По крайней мере один из них может быть устранен – muru 21 November 2017 в 04:29

Другие вопросы по тегам:

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