Я пытаюсь работать:
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 файлов и некоторые пронумерованные фиктивные файлы.
Если Вам нужно sudo
для удаления чего-либо в этом каталоге у Вас несомненно нет полномочий чтения также, который предотвращает bash
от выполнения расширения шарика – выполняет Ваш цикл в корневой оболочке вместо этого:
sudo bash -c 'for i in *; do rm "$i"; done'
"слишком много файлов для удаления в одном 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
но вкусы варьируются.