Интерактивное удаление файлов в цикле со стандартным перенаправлением ввода

Вы можете использовать awk , чтобы соответствовать двум вещам одновременно:

  • первая строка.
  • Линия, содержащая «Монго».

Там вы идете:

$ ps aux | awk 'NR == 1 || /mongo/ {print $0}'
  • Условие NR == 1 соответствует первой строке.
  • Состояние / Mongo / соответствует строкам, содержащим «Монго».
  • {Print $ 0} - это действие, связанное с двумя предыдущими условиями, в данном случае: распечатайте всю строку.
0
13.08.2015, 17:13
2 ответа

ОБНОВЛЕНИЕ: Учитывая, что find является источником данных, я бы вместо этого использовал массив:

readarray -t to_remove < <(find ...)
number_of_files=${#toremove[@]}
rm -i "${to_remove[@]}"

Если у вас версия bash до 4-й версии, используйте этот цикл для заполнения массива.

while IFS= read -r fname; do
    to_remove+=("$fname")
done < <(find ...)

Ничего из этого не работает с файлами, содержащими символы новой строки, но я считаю, что этот случай легче игнорировать, когда это возможно, хотя в bash 4 вы можете обойтись без вызова find всего:

shopt -s nullglob globstar
to_remove=( "$WORKING_PATH"/**/* )

Я полагаю, вы заполняете to_remove из файла. Не делай этого; читать прямо из файла.

while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< file.txt

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

(Если вы действительно застряли при чтении из to_remove , я бы просто использовал временный файл:

printf "%s" "$to_remove" > tmp.txt
while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< tmp.txt
rm tmp.txt

)

1
28.01.2020, 02:50

Я понял.

IFS=$'\n'
for f in `echo "$to_remove"` ; do
    rm -ir "$f"
done

Краткая версия:

IFS=$'\n'
rm -ir "$to_remove"

Эти две версии работают должным образом.


Как ни странно, следующий код не работает:

IFS=$'\n'
for f in "$to_remove" ; do
    rm -ir "$f"
done

Почему?

0
28.01.2020, 02:50

Теги

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