ファイルを上書きすると、シェルを呼び出すことなくターゲット権限が維持されます。

ファイルを上書きすると、シェルを呼び出すことなくターゲット権限が維持されます。

このような状況があります。

$ ls -la
-rw-r--r-- 1 user user 123 Mar  5 19:32 file-a
-rwx---rwx 1 user user 987 Mar  5 19:32 file-b

file-boverrideを使用したいのですが、file-aすべての権限と所有権を維持したいと思いますfile-b

権限を使用しているため動作しません。file-a

cp file-a file-b # << edit: this works as expected! My fault!
mv file-a file-b

これは機能しますが、シェルからのみ呼び出すことができます。関数やそのようなものだけを呼び出すことができる状況を想像してくださいexecve

cat file-a > file-b

私も知っています、私も次のことができます。

sh -c "cat file-a > file-b"

しかし、これはファイル名をエスケープするのが難しいので、使用したくありません。

これを行うためのいくつかの一般的なコマンドはありますか?それとも、これを行うために独自のヘルパーCプログラムを作成する必要がありますか?

答え1

パターンをコピーせずにファイルをコピーする簡単なコマンドは次のとおりです。

dd if=file-a of=file-b

ddただし、stderrに詳細なステータスメッセージが記録されます。シェルでコマンドを実行して追加することでこれを抑制できますが、2> /dev/nullそれからステップ1に戻ります。 GNUがあればddこれを行うことができます

dd if=file-a of=file-b status=none

答え2

rsync --inplace file-a file-bあなたが欲しいものをする必要があります。

https://linux.die.net/man/1/rsync

--inplaceこのオプションは、データを更新する必要があるときにrsyncがファイルを転送する方法を変更します。ファイルの新しいコピーを作成して完了したらその場所に移動するデフォルトの方法ではなく、rsyncは更新されたデータをターゲットに直接書き込みます。ファイル。

答え3

man cp説明する:

既存のターゲットファイルごとに権限が許可されている場合は、その内容を上書きします。-pこのオプションを指定しないと、対応するモード、ユーザーID、グループIDは変更されません。

これを設定すると、-pソースcpファイルの所有権とアクセス権を保持しようとしますが、デフォルトの動作は可能な限りターゲットファイルのこれらの属性を保存することです。

どういう意味ですか?」可能であれば「?

もちろん、ターゲットファイルが存在しない場合、これは不可能です。この場合、cpデフォルトの所有権(現在のユーザーと現在のユーザーのデフォルトグループ)とデフォルトの権限(参照man 2 umask)を使用してファイルが作成されます。-p独自に動作を復元するわけではありません。

また、現在のユーザーが書き込み用にターゲットを開くことができない場合、cpこの方法は機能しません。この場合、cp失敗するか1つを指定すると、既存の-fファイルの削除に置き換えられ(したがって、そのディレクトリに対する書き込み権限のみが必要です)、最初のケースを再適用します。

mvこれがあなたの階層で機能しない理由は、常にmv()を使用して最初にファイルを原子的に移動しようとするためです。これは、ターゲットが存在せず、ソースとターゲットが同じストレージエンティティにある場合にのみ機能します(通常は同じパーティション)。利点は、文字通り単一のアトミック操作として扱われ、すべての所有権とファイル権限を維持しながら、ファイルをある場所から消え、別の場所に再表示することです。これが不可能な場合は、次のように動作すると文書化されています。renameman 2 renamerenamemv

rm -f destination_path && \
cp -pRP source_file destination && \
rm -rf source_file

関連情報