Запустить скрипт пропуска файлов - PullRequest
2 голосов
/ 15 июня 2019

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

Имеется папка с файлами 0..N * .XML; Я хочу отсортировать их по имени и удалить файлы N-10 ( оставить последние 10 на месте ).

Я возился с находкой и хвостом / головой, но никак не мог понять

find /mnt/user/Temporary/1 -name *.xml | tail -n +10 | rm

Пожалуйста, прочитайте. Речь идет о сохранении последних 10. Если имеется 10 или менее файлов, ни один из них не должен быть удален!



EDIT: Поскольку кто-то закрыл, но не ответил на вопрос, вот решение для тех, кто попадает сюда с тем же вопросом.

#!/bin/bash
files=()
while IFS=  read -r -d $'\0'; do
    files+=("$REPLY")
done < <(find . -name *.xml -print0 | sort)
Limit=$((${#files[@]}-10))
count=0
while [  $Limit -gt $count ]; do
    rm "${files[count]}"
    let count=count+1 
done

Может быть, какой-нибудь linux "pro" может оптимизировать его или дать ему некоторые параметры (например, лимит, путь и шаблон файла), чтобы он мог вызываться где угодно.

1 Ответ

2 голосов
/ 15 июня 2019

РЕДАКТИРОВАТЬ : Новый ответ

#!/usr/bin/env bash

files=$(find *.xml | wc -l)

[ "$files" -lt 10 ] && echo "Files are less than 10..." && exit 1

count=$(($files-10))

for i in $(find *.xml | sort -V); do
    [ $count -eq 0 ] && echo "Done" && exit 1
    rm $i
    ((count--))
done
  • $ files хранит количество * .xml в папке
  • , если число меньше или равнона 10 выход
  • установить счетчик числа файлов для удаления
  • перебрать каждый файл в порядке
  • , если счетчик равен 0, выйти
  • если не удалить файл и увеличить счетчик
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...