Использование команды mv для перемещения файла из одной папки в другую -Странный пример

Если вы хотите, чтобы строки, отличные от -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.

20
26.08.2020, 19:30
1 ответ

TL;DR

Это заставляет назначением быть каталог, который уже существует, или команда завершается безрезультатно и используется как отказоустойчивая -.


Значение.

Каждый каталог в типичных файловых системах Unix/Unix -включает два специальных каталога :, один из которых ссылается на каталог, в котором он находится :., а другой ссылается на родительский каталог, в котором он находится :..(, что позволяет вернуться в него. иерархия каталогов ). Они относительно того, где они находятся. Таким образом, каталог .внутри каталога с именем backupsссылается на backups. Другими словами, когда есть каталог с именем backups, backups/.эквивалентен backups.


Различное поведение, когда источником или местом назначения является файл или каталог

  • Если каталог существует, обе команды будут иметь одинаковый эффект. :когда целью является каталог mvпереместит источник (с )в этот каталог. Это ожидаемый результат.

  • Если целью backupsявляется файл, а не каталог:

    • 1-й случай завершится с ошибкойNot a directory
    • 2-й случай переименует Caiti.bakи перезапишетbackups
  • Если цель не существует:

    • 1-й случай завершится ошибкой с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
46
18.03.2021, 23:09

Теги

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