Если вы хотите, чтобы строки, отличные от -a
, были отправлены на bcd.txt
, просто инвертируйтеgrep
:
grep '^a' infile.txt > a.txt
grep -v '^a' infile.txt > bcd.txt
Другим вариантом, использующим только одну команду, будет awk:
awk '/^a/ { print > "a.txt" } ! /^a/ { print > "bcd.txt" }' < input
Немного изменено, это выглядит так:
awk '
/^a/ { print > "a.txt" }
! /^a/ { print > "bcd.txt" }'
< input
... где строки, начинающиеся с a
, входят в первый блок и записываются (с добавлением )к a.txt
, а строки, начинающиеся с , а не , начинаются с a
во второй блок и записываются (с добавлением )к bcd.txt
.
Это заставляет назначением быть каталог, который уже существует, или команда завершается безрезультатно и используется как отказоустойчивая -.
.
Каждый каталог в типичных файловых системах Unix/Unix -включает два специальных каталога :, один из которых ссылается на каталог, в котором он находится :.
, а другой ссылается на родительский каталог, в котором он находится :..
(, что позволяет вернуться в него. иерархия каталогов ). Они относительно того, где они находятся. Таким образом, каталог .
внутри каталога с именем backups
ссылается на backups
. Другими словами, когда есть каталог с именем backups
, backups/.
эквивалентен backups
.
Если каталог существует, обе команды будут иметь одинаковый эффект. :когда целью является каталог mv
переместит источник (с )в этот каталог. Это ожидаемый результат.
Если целью backups
является файл, а не каталог:
Not a directory
Caiti.bak
и перезапишетbackups
Если цель не существует:
No such file or directory
Caiti.bak
в файл backups
, что приведет к предыдущему случаю и возможной потере данных в следующий раз. Хорошей практикой является добавление /.
к целевому каталогу, который предполагается существующим, и прерывание сценария при возникновении ошибки.
Все эти случаи будут работать одинаково только при добавлении /
, если источником является файл , а не каталог.
Если мы не можем этого предположить, этот пример, где источником является каталог:
mv somedirectory targetnothere/
не приведет к сбою (и какой-то каталог будет переименован вместо помещения в targetnothere или прерывания ). Дополнительный .
приведет к тому, что и этот случай не удастся:
$ mv somedirectory targetnothere/.
mv: cannot move 'somedirectory' to 'targetnothere/.': No such file or directory