В интерактивном режиме удаляющие файлы из списка

Если возможно Ваш менеджер окон (Compiz, возможно?) или декоратор окна (возможно Emerald) использует необычный эффект как альфа-размытость, которая могла бы вызвать эту проблему.

12
03.10.2012, 01:38
2 ответа

rm -i читает его ответ из стандартного входа, который он наследовал от while цикл. Так строка текста от list.txt используется в качестве ответа на, "действительно удаляют?" вопрос. Для фиксации необходимо будет разделить два источника входа. Самый легкий путь состоит в том, чтобы иметь read возьмите его вход от отдельного дескриптора файла:

while IFS= read <&3 -r i; do
  rm -i -- "$i"     # Quote the file name, not just to be safe,
                    # but because it's the right syntax.
done 3< list.txt

Вы больше не перенаправляете стандартный вход (fd 0) для цикла с условием продолжения, таким образом, rm будет читать из терминала, как желаемый.

С другой стороны, Вы, возможно, сделали:

IFS=$'\n' # set field separator to newline
set -f    # disable globbing upon command substitution
rm -i -- $(cat list.txt)

Или, с GNU xargs:

xargs -rd '\n' --arg-file=list.txt rm -i --
19
27.01.2020, 19:55
  • 1
    Таким образом, если у меня был в списке названный файл y, предыдущий файл был бы удален? –  Francesco Turco 02.10.2012, 20:52
  • 2
    Не просто y, но любое начало имени y. По-видимому, rm просто смотрят первый символ любого ответа, который он получает: 'y' да, что-либо еще нет. –  chepner 02.10.2012, 20:57

Для чего-то немного более необычного, чем ответ на да или не в каждый файл, Вы могли использовать iselect для интерактивного находящегося в ncurses выбора. например.

iselect -a -m < list.txt | xargs -d '\n' -r echo rm 

или позволить выбор файлов в текущем dir:

find . -maxdepth 1 -type f | iselect -a -m | xargs -d '\n' -r echo rm

Это отобразит полный экран (полный терминал) находящийся в ncurses список, где файлы могут быть выбраны и невыбранными по желанию путем нажатия SPACE. нажмите ENTER для принятия выборов (выбранные записи будут распечатаны на stdout), или q выходить (ничто распечатанное к stdout).пресса h для справки.

Отметьте echo rm - я записал это как этот для тестирования. измените его на просто rm после того как Вы уверены, что понимаете то, что это делает.

Также отметьте это xargs используется здесь с \n как входной разделитель. Это не будет работать, если какие-либо из имен файлов будут иметь символы перевода строки в них. В этом отношении, iselect не будет работать правильно ни один - это ожидает один объект на строку - u nfortunately, iselect не имеет опции для завершенного пустым указателем ввода или вывода.

iselect упаковывается для debian, вероятно, человечность и другие дистрибутивы также. домашняя страница по http://www.ossp.org/pkg/tool/iselect/

1
27.01.2020, 19:55

Теги

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