Как избежать необходимости несколько раз вводить «y» при удалении защищенного файла

52

Я ищу решение, которое будет использоваться в ответ на "rm: удалить обычный файл с защитой от записи [x]?"

Я думал о выдаче персонажа с последующим возвратом каретки несколько раз, в bashrc. Как мы это делаем?

Iancovici
источник
Вы можете определить функцию. Это может помочь вам: stackoverflow.com/questions/756756/… .
Alpert
почему ты хочешь сделать это? Это очень неочевидная задача - в любом случае хотеть печатать возврат каретки (в отличие от перевода строки), и в .bashrc?
10
@ l0b0 вопрос отредактирован, чтобы быть более конкретным
Iancovici
Почему вы хотите удалить файлы в .bashrc? Исходное задание до сих пор не ясно.
10
3
@echadromani В SO / SE очень часто пытаются понять исходную проблему, чтобы найти оптимальное решение, которое может быть применимо к другим ситуациям.
10

Ответы:

75

Изменить на основе обновленного вопроса:

Чтобы вас не спрашивали об удалении файлов, добавьте параметр -f(«force»):

rm -f /path/to/file

Это имеет один побочный эффект, о котором вы должны знать: если какой-либо из указанных путей не существует, он не сообщит об этом и вернется успешно:

$ rm -f /nonexistent/path
$ echo $?
0

Оригинальный ответ:

Вот одно простое решение:

yes "$string" | head -n $number | tr $'\n' $'\r'

yesповторяет любую строку, которую вы ей даете, бесконечно, разделенные символами новой строки. headостанавливает его через $numberраз и trпереводит переводы строк в возврат каретки. Вы можете не увидеть никаких выходных данных из-за возвратов каретки, но передача их этой команде (in bash) должна проиллюстрировать это:

printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"

Пользователи , не имеющие bashконсервной трубы, чтобы результат od, hexdumpили , xxdчтобы увидеть фактические символы , возвращаемые.

l0b0
источник
7

Другая проблема, с которой я сталкиваюсь время от времени, rmсвязана с псевдонимом rm -i, что-то вроде этого в / etc / bashrc:

alias rm='rm -i'

В этом случае вы можете unalias rmили можете использовать этот трюк, который я обнаружил много лет назад, поставить обратную косую черту перед командой с псевдонимом, чтобы игнорировать псевдоним только один раз, например:

\rm somefile

Вы можете узнать больше об псевдонимах через статью в Nixcraft .

SLM
источник
5

rmжестко задан вопрос «интерактивно» (запрос на ожидание ввода пользователя) для файлов, защищенных от записи. Есть два способа, чтобы не rmзадавать вопросы:

rm -rf somedir

а также

rm -r --interactive=never somedir

(оба также работают без -rудаления файлов вместо директорий)

объяснение:

-fзаставляет rm"игнорировать несуществующие файлы и аргументы, никогда не запрашивать".

--interactive=neverделает то, что говорит: никогда не быть интерактивным. другими словами: никогда не подскажу.

Разница между -fи --interactive=neverзаключается в этой части: «игнорировать несуществующие файлы и аргументы».

Для сравнения:

$ rm -rf nonexistingname
$ echo $?
0

а также

$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1

Разница в основном интересна при написании сценариев, в которых вы никогда не хотите rmбыть интерактивными, но все же хотите обрабатывать ошибки.

резюме: по командной строке rm -rf. в скриптах используй rm -r --interactive=never.


для ответа на поставленный вопрос («Как избежать необходимости несколько раз вводить« y »при удалении защищенного файла») см. https://askubuntu.com/questions/338857/automatics-enter-input-in-command-line. / 338860 # 338860

lesmana
источник
1

просто дайте да всем своим командам!

yes | rm -r /path/
yes | <command>

В любом случае вы всегда можете принудительно использовать -f:

rm -r -f /path
Накамото
источник
-2

Я тоже столкнулся с той же проблемой. Приведенный выше ответ только для одного файла, но если вы хотите игнорировать много да.

Вы можете использовать

sudo rm -r /path/to/directory

удалить все защищенные от записи обычные файлы

Гопал Прасад
источник
Это понизили, потому что это удаляет весь каталог. Предположительно OP хочет удалить только рассматриваемый файл, а не каждый отдельный файл в одном поддереве каталога.
Джейк
Эй .... Может быть, вы правы.
Гопал Прасад
Эй .... Может быть, вы правы. Но не в этом случае .. Как будто у пользователя много терпения и времени, то у него также есть время, чтобы дать «да» несколько раз ... Я предположил, что он хочет удалить все файлы с помощью одной команды .. Как написать Защищенный файл всегда запрашивает подтверждение перед удалением этого типа файла. Один из таких примеров - в случае, когда вы создаете virtualenv, а затем хотите удалить в python. Пожалуйста, попробуйте, и вы найдете команду rm, запрашивающую подтверждение, и каждый раз Вы должны предоставить ответ .. Я разрешил ситуацию таким образом.
Гопал Прасад