質問するログイン新規登録
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

972閲覧

Go言語の os.Linkのコピーがフォルダ全体に及んでしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/02/04 16:16

0

0

前提・実現したいこと

Go言語でファイルのバックアップのためのコピーをしたいので、
毎回コピーするファイルに、現在の日時をファイル名に付けてバックアップしている。
しかし日付でファイル名を区別しているにも関わらず、
同一フォルダに存在する同じ拡張子のファイルすべてに最新の内容が上書きされてしまう。

これはGo言語の何らかの仕様によるものですか、それともコードのエラーでしょうか。
是非ご教授ください。

該当のソースコード

Go言語

1package main 2 3import ( 4 5 "os" 6 "time" 7 8) 9 10func main() { 11 12 now := time.Now() 13 layout := "2006.01.02-15.04.05" 14 date := now.Format(layout) 15 16 src := "hoge/hoge/hoge" 17 dst := "fuga/fuga/fuga" 18 19 os.Link(src + "/" + "new.txt", dst + "/" + date + "new.txt") 20 21}

補足情報(FW/ツールのバージョンなど)

Windows 10
go1.17.6 windows/amd64

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/05 02:54 編集

ありがとうございます、これで実現できました。 package main import ( "os" "io" "time" ) func main() { now := time.Now() layout := "-2006.01.02-15.04.05-" date := now.Format(layout) src, err := os.Open("hoge/hoge/hoge/new.txt") if err != nil { panic(err) } defer src.Close() dst, err := os.Create("fuga/fuga/fuga/" + date + "new.txt") if err != nil { panic(err) } defer dst.Close() _, err = io.Copy(dst, src) if err != nil { panic(err) } }
guest

回答1

0

ベストアンサー

原因は、ファイルのコピーではなく hard linking を実行しているからです。

os.Link

func Link(oldname, newname string) error

Link creates newname as a hard link to the oldname file. If there is an error, it will be of type *LinkError.

以下の実行例で判るかと思いますが、i-node number(12454899)が全て同じになっています。また、プログラムを実行する毎に link count が増加しています。

bash

1# src file 2$ cat hoge/hoge/hoge/new.txt 3new text 4$ stat -c '%i %h %y %n' hoge/hoge/hoge/new.txt 512454899 1 2022-02-05 01:53:47.561620194 +0900 hoge/hoge/hoge/new.txt 6 7# first execution 8$ go run . 9$ stat -c '%i %h %y %n' fuga/fuga/fuga/*new.txt 1012454899 2 2022-02-05 01:53:47.561620194 +0900 fuga/fuga/fuga/2022.02.05-01.54.32new.txt 11 12# append data 13$ echo 'Hello, world' >> hoge/hoge/hoge/new.txt 14new text 15Hello, world 16$ stat -c '%i %h %y %n' hoge/hoge/hoge/new.txt 1712454899 2 2022-02-05 01:55:58.611363300 +0900 hoge/hoge/hoge/new.txt 18 19# second execution 20$ go run . 21$ stat -c '%i %h %y %n' fuga/fuga/fuga/*new.txt 2212454899 3 2022-02-05 01:55:58.611363300 +0900 fuga/fuga/fuga/2022.02.05-01.54.32new.txt 2312454899 3 2022-02-05 01:55:58.611363300 +0900 fuga/fuga/fuga/2022.02.05-01.59.27new.txt 24$ cat fuga/fuga/fuga/2022.02.05-01.54.32new.txt 25new text 26Hello, world

投稿2022/02/04 17:16

melian

総合スコア21341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/05 02:52

詳しくありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問