cpの代わりに一時ファイルにファイルを交換しますか? [コピー]

cpの代わりに一時ファイルにファイルを交換しますか? [コピー]

両方の変数を交換する必要がある有名な入門プログラミングの練習があります。確実な解決策は、3番目の一時変数を使用することです。しかし、言語にタプルのようなものがあれば、引数を逆の順序で返す非常に単純なヘルパー関数を書くことができます。

def swap(a: Int, b: Int): (Int, Int) = (b, a)
val (two, one) = swap(1, 2) // => (2, 1)

Linuxでのファイル操作でもこれが可能かどうか疑問に思います。たとえば、状況に応じて変更したい設定がある場合は、2つのファイル名を取得してその内容を変更するコマンドがありますか?
たとえば、a.txt ファイルの内容が「Hello」で、b.txt の内容が「World」であるとします。ここで呼び出したものを呼び出した後、swapa.txtに「World」を、b.txtに「Hello」を含めたいと思います。

この問題は、スワップパーティションがすべての検索結果を支配していたため、最初に考えたよりも調査するのが困難でした。

ベストアンサー1

カーネルレベルでこれを行うLinux固有のシステムコールがあります。

関連するシステムコールは次のとおりです。renameat2()renameat()これは、この問題を解決するために追加の特定のフラグで使用できるLinux固有の拡張です。 Linux 3.15 に追加され、glibc サポートが glibc 2.28 に追加されました。

RENAME_EXCHANGE

原子交換古い道そして新しい道。両方のパス名が存在する必要がありますが、タイプが異なる場合があります。たとえば、1つは空でないディレクトリ、もう1つはシンボリックリンクです。

この機能をサポートできるファイルシステムには追加の制限があります。これ子検索2014年以降に追加されたさまざまなファイルシステムのサポートの紹介:ext4、ヒューズ、f2fs、shmem / tmpfs、xfs、gfs2、overlayfs、btrfs、ubifs、affs ...

このシステムコールを使用するための正しいコマンドがない場合、以下はすべてのシンボルが「手動で」(このアーキテクチャ= 316など)原子的に解決される非常にアーキテクチャ固有(amd64 / x86_64)Pythonの例です。SYS_renameat2Cでシステムコールが実行するアクションを示すと名前のスワップファイル:abstrace

$ echo Hello > a.txt; echo World > b.txt
$ cat a.txt
Hello
$ cat b.txt
World
$ strace -e trace=renameat2 python3 -c 'import ctypes; libc = ctypes.CDLL(None); libc.syscall(316, -100, b"a.txt", -100, b"b.txt", 2);'
renameat2(AT_FDCWD, "a.txt", AT_FDCWD, "b.txt", RENAME_EXCHANGE) = 0
+++ exited with 0 +++
$ cat a.txt
World
$ cat b.txt
Hello

もちろん適切な図書館会議単純化するこのPythonの例。

おすすめ記事