Сказать «да всем» используя rm -i


10

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

rm -i *

просто чтобы убедиться, что я в порядке с файлами, которые я удаляю. Так что это попросит меня для каждого файла. После нескольких файлов, я понимаю, что это именно то, что я хотел удалить. Вместо того, чтобы CTRL+Cпросто думать и делать rm *, могу ли я просто сказать « да» всем ?

Этот вопрос больше связан с любопытством, чем с функциональностью.


Странный вопрос, но в любом случае давайте будем креативны в наших ответах!
дольмен

Ответы:


8

Нет.

(Если вы не найдете способ перевернуть «интерактивный» бит с помощью отладчика.)


[нужная цитата] :-)
Даниэль Бек

6
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(генерируется) → rpmatch(3): «возвращает 0 для распознанного отрицательного ответа (« нет »), 1 для распознанного положительного ответа (« да ») и -1, если значение ответа не распознано»
user1686

Очень хорошая находка!
Даниэль Бек

3
Кроме того, вы можете просто вставить большое количество y [перевод строки] в терминал, что не «Да для всех», но происходит то же самое.
Олли

ха-ха, правда о 'y [linebreak]', мне нравится! :)
Амит

9

Ну, это не совсем отвечает на ваш вопрос. Но вместо использования rm -iрассмотрите псевдоним rmдля rm -I:

Страница руководства гласит:

-I     prompt once before removing more than three files, or when removing 
       recursively. Less intrusive than -i, while still giving protection 
       against most mistakes

в вашем ~/.bashrc, положите:

 alias rm='rm -I'

это на самом деле полезно!


4

Есть ли способ, которым я могу просто сказать Да всем?

Ответ - да, используя этот код:

$ yes "yes" | rm -vRI directory

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

3

Просто проверьте сначала с помощью, ls *.blaа затем, rm -f *.blaможет быть?

Будьте осторожны!


Хаха, правда, это возможно
Амит

3

Если вы работаете на экране (хорошая идея в целом), вы можете сделать:

ctrl-a : exec .! yes y

Это заставит screen выполнить команду «yes», где y будет выводом, и направить указанный вывод в работающую программу (rm -i).


2

Это можно сделать, заменив дескрипторы файлов приложения на лету. Вам понадобится промежуточный файл, хотя.

Вы можете использовать gdb и именованный канал следующим образом (при условии, что вы используете больше терминалов, в противном случае вам придется использовать screen или что-то еще):

  • создать именованный канал с помощью "mkfifo myYesYesPipe"
  • запустите интерактивную копию с помощью команды rm -i и найдите ее PID
  • открыть GDB

Затем введите следующие команды в GDB, заменив PID

attach rmPID
call open("/path/to/myYesYesPipe",66,0666)
call dup2(3,0)
call close(3)
detach
quit

Это заменяет клавиатуру именованным каналом для rm.

Теперь вам нужно заполнить именованную трубу

  • запустить да> / путь / к / myYesYesPipe

rm прочитает трубу и все перезапишет.


@grawity. Вы вдохновили меня на использование отладчика.
Дэвид Коста

1
  1. Поместите rmпроцесс в фоновом режиме с Ctrl+Z.
  2. Напомним последнюю команду ( rm -i *команду)
  3. Удалить -i
  4. Enter запустить команду
  5. fg %1
  6. Ctrl+C

3
5s/fg/kill/; 6d
user1686

3
Как это лучше, чем то, что пользователь явно упомянул, что он не хочет делать?
Даниэль Бек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.