Удаление нескольких файлов с одинаковым префиксом (слишком длинный список аргументов)

Чтобы создать новую переменную массива, присвойте значения старого массива новому массиву следующим образом:

my_databases=(value1 value2 value3)
new_array=("${my_databases[@]}")

Если вы используете

new_array=$my_databases

новая переменная не будет массивом (если вы не используетеdeclare -a new_array=$my_databases$my_databasesрасширяется только до первого значения массива.

2
29.01.2021, 14:26
2 ответа

Предположим, у нас есть набор тестовых данных из тестовых файлов:

$ tree
.
├── index.php
├── index.php.bar
├── index.php.foo
├── keppme.php
└── level1
    ├── index.php
    ├── index.php.l1
    ├── keepme.php
    └── level2
        ├── index.php
        ├── index.php.foo
        └── keepme.php

Удалить все файлы, начинающиеся сindex.php:

$ find. -type f -name 'index.php*' -delete

Тогда тестовые файлы выглядят так:

$ tree
.
├── keppme.php
└── level1
    ├── keepme.php
    └── level2
        └── keepme.php

Удалите те, что добавлены после .phpрасширения (, например lindex.php.foo), но оставьтеindex.php:

$ find. -type f -name 'index.php.*' -delete

Затем данные теста показывают:

$ tree
.
├── index.php
├── keppme.php
└── level1
    ├── index.php
    ├── keepme.php
    └── level2
        ├── index.php
        └── keepme.php

Вместо использования опции -deleteвы также можете выбрать xargsдля параллельного удаления файлов. Иногда для удаления большой коллекции файлов это может ускорить весь процесс, но не всегда.

Выполнить команду rmна каждом ядре/процессоре с максимальным количеством файлов 100на rmвызов:

$ find. -type f -name 'index.php.*' -print0 | xargs -r0 -P $(nproc) -n 100 rm
2
18.03.2021, 22:33

Я предполагаю, что вы хотите удалить только файлы index*в текущем каталоге , поэтому вы используете -prune.

Используя -pruneдля всех найденных путей,вы эффективно предотвращаете findот спуска в ., путь поиска верхнего -уровня. Следовательно, ни одна из ваших команд findничего не сделает.

Чтобы удалить все index*файлы в текущем каталоге (, но не ниже ), используйте стандартную

find. ! -path. -prune -type f -name 'index*' -exec rm {} +

или нестандартный -

find. -maxdepth 1 -type f -name 'index*' -delete

или просто выполните цикл оболочки:

for name in./index*; do rm "$name"; done

Приведенный выше цикл оболочки не будет проверять тип файла, как это делает -type fс find. Для этого:

for name in./index*; do
   [ -f "$name" ] && [ ! -L "$name" ] && rm "$name"
done

Или, сzsh:

for name in./index*(.N); do rm $name; done

или

autoload -U zargs
zargs -r -- index*(.N) -- rm --

... который вызывает rmкак можно меньше раз.

1
18.03.2021, 22:33

Теги

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