Чтобы создать новую переменную массива, присвойте значения старого массива новому массиву следующим образом:
my_databases=(value1 value2 value3)
new_array=("${my_databases[@]}")
Если вы используете
new_array=$my_databases
новая переменная не будет массивом (если вы не используетеdeclare -a new_array=$my_databases
)и $my_databases
расширяется только до первого значения массива.
Предположим, у нас есть набор тестовых данных из тестовых файлов:
$ 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
Я предполагаю, что вы хотите удалить только файлы 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
как можно меньше раз.