Вы можете использовать awk
, чтобы соответствовать двум вещам одновременно:
Там вы идете:
$ ps aux | awk 'NR == 1 || /mongo/ {print $0}'
NR == 1
соответствует первой строке. / Mongo /
соответствует строкам, содержащим «Монго». {Print $ 0}
- это действие, связанное с двумя предыдущими условиями, в данном случае: распечатайте всю строку. ОБНОВЛЕНИЕ: Учитывая, что 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
)
Я понял.
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
Почему?