С awk
и его функцией system()
.
awk '{ system("echo rm "$2) }' list
Вышеупомянутое верно, если у вас не будет пробелов в имени вашего файла, если вместо этого вы попробуете ниже.
awk '{gsub(/^.*: | exists in filesystem$/,""); system("echo rm \"" $0"\"")}' list
Обратите внимание, что ни один из вышеперечисленных способов не сможет обнаружить символы новой строки в имени файла, если таковые имеются.
Снимите echo
, чтобы выйти из -сухого хода.
$ sed -n -f script.sed file
/this/is/a/test
/this/is/a
/this/is
/this
/is/a/test
/is/a
/is
/a/test
/a
/test
Где script.sed
это
:outer
h
:inner
/./ {
p
s:/[^/]\{1,\}$::
t inner
}
g
s:^/[^/]\{1,\}::
t outer
и где file
— это файл, содержащий путь к примеру, который вы упомянули.
Этот сценарий реализует двойной цикл, обрабатывающий каждую строку ввода. Он ожидает получить строки с путями только .
Внешний цикл (с меткойouter
)копирует текущую строку в область хранения(h
). Внутренний цикл (с меткой inner
), который полностью пропускается, если строка пуста, затем печатает текущую строку, если она не пуста. Затем последний /<anything>
удаляется из текущей строки, и, если эта замена изменила данные, t inner
возвращается к началу внутреннего цикла.
В противном случае сохраненная строка извлекается из области удержания (g
), а первая /<anything>
удаляется из нее. Если эта замена изменила данные, код возвращается к началу внешнего цикла.
Конечным результатом является то, что вы печатаете свое полное имя пути, затем вы получаете каждое имя пути, которое генерируется путем отсечения последовательных компонентов пути с его конца.
Затем то же самое повторяется с путем, который вы получаете, удаляя первый элемент пути из исходного имени пути. И т. д.
Если поменять местами две замены в коде, получится то же самое, но в другом порядке:
/this/is/a/test
/is/a/test
/a/test
/test
/this/is/a
/is/a
/a
/this/is
/is
/this