find
+bash
раствор:
find. -type f -name "*.pdf" -exec bash -c \
'p="/my_dir/backup/"; bn=${1##*/};
[[ "$1" != $p* ]] && [[ -f "${p}$bn" ]] && cp "${p}$bn" "$1"' _ {} \;
p="/my_dir/backup/"
-путь к начальному (ключевому )каталогу bn=${1##*/}
-базовое имя файла Достаточно небольшой корректировки первой sed
операции:
sed -n '/PAT1/,/PAT2/{/^x [[:digit:]]*/p;}' file.txt > newfile.txt
PAT1
и PAT2
, если только они не встречаются в той же строке, что и ^x [0-9]
. В этом случае:sed -n '/PAT1/,/PAT2/{/PAT1\|PAT2/!{/^x [0-9]*/p;};}' file.txt
также исключает PAT1
иPAT2
Причина, по которой следующее ничего не делает:
sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p'
^
заключается в том, что первая команда(sed
)не получила никакого ввода из файла, поэтому ожидает ввода от standard input
, то есть с вашей клавиатуры.
Точка с запятой не заключена в кавычки и является частью синтаксиса оболочки для интерпретации введенных вами команд. Проще говоря, строка выше означает:execute a command named 'sed', then execute a command named '/^x [[:digit:]]*/p'
— что не имеет смысла.