Это лучше всего подходит для awk
$ cat ip.txt
Josh, Adams, Joshadams@gmail.com
Henry, Ford, HFord@gmail.com
$ awk -F"[ ,]+" '{print $2, $1}' ip.txt
Adams Josh
Ford Henry
-F "[,] +"
разделитель полей - это один или несколько пробелов и ,
символов Достаточно интересно, кажется, что ответ может быть: «Это зависит от обстоятельств».
Для ясности: mv
указывается с до
Утилита
mv
должна выполнять действия, эквивалентные функцииrename ()
В спецификации функции переименования говорится:
Эта функция
rename ()
эквивалентна для обычных файлов функции , определенной стандартом ISO C. Его включение здесь расширяет определение , включая действия с каталогами, и определяет поведение , когда новый параметр называет уже существующий файл. Эта спецификация требует, чтобы действие функции было атомарным.
Но последняя спецификация ISO C для rename ()
гласит:
7.21.4.2 Функция
переименовать
Краткое содержание
#include
int rename (const char * old, const char * new); Описание
Функция
rename
вызывает файл имя которой - строка, на которую указываетстарый
, отныне известная под именем , заданным строкой, на которую указываетnew
. Файл с именемстарый
больше не доступен с этим именем.Если файл, названный строкой, на которую указываетnew
, существует до вызова функцииrename
, поведение определяется реализацией.Возвращает
Функция
rename
возвращает ноль, если операция завершается успешно, ненулевое значение в случае неудачи; в этом случае, если файл существовал ранее, он все еще известен под своим исходным именем.
Удивительно, но обратите внимание, что нет явного требования атомарности. Он может потребоваться где-то еще в последнем общедоступном стандарте C, но мне не удалось его найти. Если кто-то может найти такое требование, мы приветствуем правки и комментарии.
См. Также Является ли rename () атомарной?
Согласно странице руководства Linux :
Если
newpath
уже существует, он будет заменен атомарно, поэтому что не существует точки, в которой другой процесс, пытающийся получить доступ кnewpath
, не обнаружит, что он отсутствует. Однако, вероятно, будет окно , в котором обаoldpath
иnewpath
относятся к переименованному файлу .
На странице руководства Linux утверждается, что замена файла будет атомарной.
Тестирование и проверка того, что атомарность может быть очень сложной, однако, если это то, насколько далеко вам нужно зайти. Вам непонятно, что вы имеете в виду, используя «Как я могу проверить, является ли mv атомарным».Вы хотите, чтобы требования / спецификация / документация были атомарными, или вам действительно нужно проверить это?
Также обратите внимание, что выше предполагает , что имена двух файлов операндов находятся в та же файловая система. Я не могу найти стандартного ограничения для утилиты mv
, чтобы обеспечить это.
mv
основан на системном вызове rename
, а rename ()
является атомарным. Вы можете посмотреть справочную страницу rename (2)
.
Вы можете найти ответ на Является ли rename () атомарной? в stackoverflow.
Какую фс вы использовали?
В дополнение к проверке системных вызовов и их атомарности, возможно, inotify-tools
может служить проверкой, хотя я не уверен, является ли это гарантированным доказательством атомарности.
Открыть 2 ракушки. Смотрите целевой каталог перемещения в одном из них:
inotifywait -m target/
Переместить файл в другой каталог:
mv foobar target/
В inotifywait
должна отображаться только одна строка:
target/ MOVED_TO foobar
Это кажется атомарным по сравнению с ответом на ls target/
и touch target/a
, которые выдают многострочные сообщения вроде:
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
ПС
Думаю,по крайней мере, это показывает, что асинхронное многопроцессорное взаимодействие с файлами безопасно сinotify
(практически атомарно ):в любом случае вы бы ответили только после того, как inotify
дал окончательный сигнал после операции. Например, настройка производителя -потребителя может быть легко и безопасно реализована с помощью inotify
.