Как удалить все файлы в каталоге с определенными расширениями, кроме последних 5 из них [дубликат]

Для настройки моста между Ethernet и Wi-Fi достаточно просто сделать в /etc/network/interfaces:

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual

auto br0
iface br0 inet static
bridge_ports eth0 wlan0
    address 192.168.1.100
    netmask 255.255.255.0

Замените IP-адрес на более подходящий для вашей сети.

Если вы предпочитаете присвоение IP через DHCP, измените его на:

auto br0
iface br0 inet dhcp
bridge_ports eth0 wlan0

После изменения /etc/network/interfaces либо перезапустите Debian, либо выполните

service networking restart

Активирует эту конфигурацию.

Для этой конфигурации необходимо установить bridge-utils. Вы можете установить его с помощью:

sudo apt install bridge-utils

Для получения дополнительной информации см.:

BRIDGE-UTILS-INTERFACES

Интерфейс wlan0 также должен быть настроен для подключения к удаленной точке доступа, поэтому эта конфигурация не используется дословно.

Дополнительное примечание: соединение eth0 и wlan0 вместе означает, с точки зрения непрофессионала, что br0 будет представлять себя как единый логический интерфейс, поглощающий интерфейсы, составляющие часть моста. Обычно такая конфигурация выполняется, когда оба расширения или принадлежат одной и той же сети.

0
04.04.2017, 16:05
5 ответов

Следующая команда выведет список всех файлов, кроме последних 5:

ls -l | grep '\.gz\|xz\|ext4$' | head -n `expr \`ls | grep '\.gz\|xz\|ext4$' | wc -l\` - 4`

Вы сможете преобразовать ее в команду для легкого удаления файлов.

0
28.01.2020, 02:16

Если обычный порядок сортировки в порядке (т.е. ваши файлы именуются по дате), а ваша оболочка поддерживает массивы, вы можете использовать их для этого, избегая обычные предостережения относительно использования ls :

F=(./*.{gz,xz,ext4})          # list files
G=("${F[@]:5}")               # pick all but the first five to another array
G=("${F[@]:0:${#F[@]}-5}")    # or pick all but the last five
rm -- "${G[@]}"               # remove them

zsh может сортировать по дате, так что это захватит соответствующие файлы в массив, отсортированный по времени модификации

F=(./*.(gz|xz|ext4)(Om))

( (Ом) для самых новых последних, (om) для самых новых в первую очередь.) Обработайте массив, как указано выше.


Конечно, если вам нужно отсортировать по дате изменения, нельзя использовать zsh и знать, что ваши имена файлов хороши , простой ls -t | tail -n +6 подойдет. ( tail -n +6 начинает печать с шестой строки, то есть пропускает первые пять. У меня был off-by -one сначала.)

С GNU ls, я думаю, мы могли бы попросить его указать имена файлов в кавычках, чтобы создать подходящий ввод для оболочки, а затем заполнить массив выводом:

eval "F=($(ls -t --quoting-style=shell-always ./*.{xz,gz}))"

Но это требует доверия что ls и оболочка согласовывают способ интерпретации кавычек.

3
28.01.2020, 02:16

Вы почти у цели.

Используйте длинный формат параметра, чтобы указать необходимое количество строк, а затем отмените его. (Противоположная логика может использоваться с хвостом ).

head --lines = 3 отпечатки с головы три строки

head --lines = -3 отпечатки с головы, кроме последних трех

Вот пример использования головы и восьмистрочный файл с именем f

$ cat f
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
$ head -3 f
line 1
line 2
line 3
$ head --lines=3 f
line 1
line 2
line 3
$ head --lines=-3 f
line 1
line 2
line 3
line 4
line 5

. Убедитесь, что эта часть производит то, что вы хотите, прежде чем начинать удаление файлов.

Длинный вариант не является строго обязательным, но он не имеет наследия обратной совместимости с эволюцией команд хвоста и головы, и я считаю, что его легче запомнить.

head -n-3 эквивалентно длинному параметру head --lines = -3 f

См. Ниже

$ head -3 f #originally
line 1
line 2
line 3
$ head -n3 f #
line 1
line 2
line 3
$ head -n+3 f
line 1
line 2
line 3
$ head -n-3 f
line 1
line 2
line 3
line 4
line 5
$
1
28.01.2020, 02:16
ls -1 | grep '\.gz$\|xz$\|ext4$' | tail -n +6 | xargs rm

Предостережения: В ваших файлах не должно быть пробелов/кавычек.

set -f; set ./*.[gx]z ./*.ext4; [ "$#" -gt 5] && shift 5; rm -f "$@"

Ниже приведены имена файлов любого типа:

td="`mktemp`" \
   find . -maxdepth 1 -type f \( -name \*.[gx]z -o -name \*.ext4 \) -exec sh -c '
      [ ! -s "$td" ] && [ "$#" -gt 5 ] && { shift 5; echo >> "$td"; }
      rm -f "$@"
   ' x {} +
rm "$td"
1
28.01.2020, 02:16

В bash:

ls -1 *.{gz,xz,ext4} | head -n-5 | xargs -r rm

Ключевым моментом является то, что head -n-5 выведет все строки, заканчивающиеся перед 5-й с конца (т.е. все строки, кроме последних 5). Думаю, остальное вам понятно.

Двойником для tail будет tail -n+6, который выведет все строки, начинающиеся с 6-й (т.е. все строки, кроме первых 5).

1
28.01.2020, 02:16

Теги

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