Я слепой или нет выбора, как --in-place
для sort
?
Чтобы сохранить результаты во входном файле, sed использует -i
( --in-place
).
Перенаправление вывода sort
во входной файл
sort < f > f
приводит к тому, что он становится пустым. Если нет --in-place
выбора - может быть, есть какая-то хитрость, как сделать это удобным способом?
(Единственное, что приходит мне в голову:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Перемещение не является правильным выбором, потому что права доступа к файлу могут быть изменены. Вот почему я перезаписываю содержимое временного файла, который затем удаляю.)
text-processing
sort
Гжегож Вежовецкий
источник
источник
insitu
возможность использования любых команд на месте.sort
.Ответы:
sort
имеет-o, --output
параметр, который принимает имя файла в качестве аргумента. Если он совпадает с входным файлом, он записывает результат во временный файл, а затем перезаписывает исходный входной файл (точно так же, как и то, чтоsed -i
делает).Со
GNU sort
страницы информации:и из Открытой группы базовых спецификаций, выпуск 7 :
источник
man sort
- это недокументированная особенность? Это стандартно и портативно?sort -o <filename> <filename>
безопасно отсортировать файл на месте.Вы можете использовать
sponge
функцию, которая сначала пропитывает,stdin
а затем записывает ее в файл, например:Недостатком
sponge
является то, что он будет хранить выходные данные временно в памяти, что может быть проблематично для больших файлов. В противном случае вы должны сначала записать его в файл, а затем перезаписать исходный файл.Однако, как указывают другие ответы, изменения на месте, как правило, не очень хорошая идея, поскольку в середине процесса (например,
sponge
одного) машина может аварийно завершить работу, и тогда вы можете потерять как исходный, так и новый файл. Лучше сначала записать его в другой файл, а затем использовать атомарнуюmv
(перемещение) инструкцию.источник
Перезаписывать входной файл выходным файлом опасно, потому что, если во время записи файла происходит сбой программы или системы, вы потеряете оба.
Некоторые программы (в основном версии GNU) имеют опцию на месте (например,
-i
в perl и GNU sed;-o
в сортировке GNU). Они работают, помещая данные во временный файл и затем перемещая его на место. Для программ , которые не имеют такой варианта, Колин Уотсонsponge
утилита (входит в moreutils Джой Гесса ) делает работу безопасно для любой программы (примеры: Можем ли я сделатьcut
? Изменить файл на месте , как я могу сделать Iconv заменить входной файл с преобразованным выходной? )Только в тех редких случаях, когда вы не можете восстановить исходный файл с теми же разрешениями, я рекомендую перезаписать файл на месте. В этом случае вам лучше сохранить исходный ввод где-нибудь. И тогда вы можете просто обработать копию ввода и отправить ее в исходный файл.
источник
sort -o
не специфичен для GNU и специально предназначен для переопределения файла на месте.sort
не может начать запись своих выходных данных до того, как они полностью прочитают свои входные данные (использует память или временные файлы для хранения данных), поэтому вполне естественно, что он должен иметь возможность переопределить свои входные данные.sort
не POSIX, так какsort -mo file1 file1 file2
не гарантированно будет работать, в то время как традиционныеsort
S знают, как обойти это (уже в Unix V7 в 70-х).sort -o
у меня работает с coreutils 8.25, и это свойство задокументировано в руководстве (отмечая, что это только при сортировке, а не при объединении). Если вы можете воспроизвести это, отправьте отчет об ошибке (с указанием точной командной строки, точных входных файлов, в какой системе вы работаете и как вы получили двоичный файл).Используйте
-o
или попробуйте vim-way:источник