расширение шарика, внезапно не работающее правильно в циклах

Я пытаюсь работать:

for i in *; do sudo rm $i; done

Проблема состоит в том, что существует что-то не так с расширением шарика, и я получаю ошибку:

rm: cannot remove '*': No such file or directory

Я получаю эту ошибку в течение каждого раза, когда цикл работает. Файлы удалены (даже при том, что я использовал CTRL+C для остановки ошибок), но я получаю эту ошибку, которую я не должен получать, поскольку я не вышел из символа шарика, и я не использовал одинарных кавычек.

Это всегда работало в прошлом без ошибки.

Кроме того, если я работаю:

sudo rm 1*

например, это будет работать, используют шарик правильно. Однако, если я работаю:

for i in 1 2 3 4 5 6 7 8 9; do sudo rm $i*; done

Я получаю следующее:

rm: cannot remove '1*': No such file or directory
rm: cannot remove '2*': No such file or directory
rm: cannot remove '3*': No such file or directory
rm: cannot remove '4*': No such file or directory
rm: cannot remove '5*': No such file or directory
rm: cannot remove '6*': No such file or directory
rm: cannot remove '7*': No such file or directory
rm: cannot remove '8*': No such file or directory
rm: cannot remove '9*': No such file or directory

Что не так с моими шариками в циклах теперь?

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


Править:

Кажется, что это - только проблема, когда существует чрезмерно большое количество файлов. Я выполнил команду: for i in *; do sudo rm $i; done на том же каталоге только с 800 файлами и я не мог воспроизвести ошибку.

Я также протестировал команду: for i in 1 2 3 4 5 6 7 8 9; do sudo rm $i*; done и я не получил ошибку, только удалив ~800 файлов и некоторые пронумерованные фиктивные файлы.

0
задан 30 November 2019 в 09:52

2 ответа

Если Вам нужно sudo для удаления чего-либо в этом каталоге у Вас несомненно нет полномочий чтения также, который предотвращает bash от выполнения расширения шарика – выполняет Ваш цикл в корневой оболочке вместо этого:

sudo bash -c 'for i in *; do rm "$i"; done'
0
ответ дан 21 December 2019 в 23:47

"слишком много файлов для удаления в одном rm команда". - проблема с известным решением - использование find и xargs. Вместе они обрабатывают "слишком много файлов", а также "файлов с забавными символами". Читать man find и man xargs.

Ваш особый случай,"for i in *; do sudo rm $i; done"был бы выражен как

find . -maxdepth 0 -type f -print0 |\
    xargs -0 --no-run-if-empty sudo rm

будет работать как немногие sudo rm команды, как это может, наполняя столько имен файлов, сколько это может на строке (см. xargs --show-limits </dev/null ).

Или, каждый мог

sudo find . -maxdepth 0 -type f -delete

но вкусы варьируются.

0
ответ дан 21 December 2019 в 23:47

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

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