質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

7回答

8539閲覧

ディレクトリ構成を維持しつつコピーし、コピー終了後、コピー元を削除するには

YuuichiroEndo

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2016/09/02 07:25

編集2016/09/02 07:32

現在、CentOS上にてファイルのバックアップ処理を構築しております。

bashにて組んでおりますが、

その中で、

ディレクトリ構成を維持しつつコピーし、
コピー終了後、コピー元を削除する

必要が出てきました。

出来れば、コマンド発行1回で出来れば良いなと考えているのですが、
そのような事は可能でしょうか?

「rsync」や「cp」では、ディレクトリ構成を維持したままファイルをコピーは出来ると思うのですが、コピー元のファイルは残ってしまうと思いますが、コピー元を削除するような方法が御座いますでしょうか?

よろしくお願い致します。

申し訳御座いません。
以下、追記致します。

ディレクトリ内には、バックアップ対象ファイルと非バックアップ対象ファイルが混在しておりますので、ディレクトリ毎 mv は出来ないのではないかと思っております。

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

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

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

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

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

otn

2016/09/02 12:28

移動対象のファイルかどうかはどうやって判断するのですか?
YuuichiroEndo

2016/09/02 13:05 編集

ファイルの更新日付を取得し、現在日時より30日より前に作成されたファイルを移動対象としています。
guest

回答7

0

「cp」では、ディレクトリ構成を維持したままファイルをコピーは出来ると思うのですが、コピー元のファイルは残ってしまうと思いますが、コピー元を削除するような方法が御座いますでしょうか?

mv でいいんじゃないですかね…

投稿2016/09/02 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

mvコマンドを使いましょう。

同じファイルシステム上であればディレクトリエントリの更新でアトミックに処理されるため、問題も発生しません。

異なるファイルシステムにmvする場合は内部的に複製が発生するので、別途考慮が必要です。
ファイルシステムが異なる場合、mvコマンドを使えばコピーが完了したものから順次削除されます。
標準コマンドはエラー処理なども作りこまれているため、こちらを利用するのをおすすめします。

問題が発生するケースとしては、シンボリックリンクだけ先に移動した後に、実体コピー中に容量不足等で移動に失敗した場合です。
この場合はデッドリンクとなります。

--
以下追記(修正)

バックアップ対象がsrc/aaa/a.txtsrc/aaa/b.txtsrc/bbb/c.txtとして、移動元を消す場合は以下のコマンドで一発で出来ます。

listの内容

src/aaa/a.txt src/aaa/b.txt src/aaa/c.txt

バックアップして削除

(tar cpf - -T list | tar xpf - -C dst); xargs rm < list

dstはバックアップ先フォルダです。

投稿2016/09/02 07:31

編集2016/09/02 08:40
moonphase

総合スコア6621

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

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

YuuichiroEndo

2016/09/02 08:20 編集

ご回答ありがとうございます。 ちなみに、上記のコマンドだとコピー先でディレクトリ構成は維持されておりますでしょうか? コピー先で ーーーーーーーーーーー dst   aaa     a.txt     b.txt   bbb     c.txt ーーーーーーーーーーー となるようなイメージです。
moonphase

2016/09/02 08:23

うっかりしてました。ディレクトリ構造保てないですね。 1ライナーでやるのは難しいので、スクリプトを書いてそれを呼び出すのはいかがでしょうか。
moonphase

2016/09/02 08:40

先ほどの回答は間違えていたので、1コマンドではないけど、1行で可能な方法について回答に追記修正しておきました。
guest

0

mvコマンドでディレクトリを移動させるのはどうでしょうか。
参考

投稿2016/09/02 07:28

tanat

総合スコア18709

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

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

0

rsync に --remove-source-files を渡すとコピー元が消えます。
ただしディレクトリは消えません。

# mkdir -p src/a/b src/c/e # touch src/a/b/x # touch -t 198001010000 src/c/e/y # rsync -a --remove-source-files --files-from=<(cd src; find -mtime -30 -type f) src/ dst/ # find . ./dst ./dst/a ./dst/a/b ./dst/a/b/x ./src ./src/c ./src/c/e ./src/c/e/y ./src/a ./src/a/b

投稿2016/10/04 08:33

NOTEPAD

総合スコア80

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

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

0

moonphaseさんの回答に乗っかりますが…

(cd /hoge;tar cpf - -T list) | (cd /piyo;tar xpf -;xargs rm < list)

こんな感じの使い方もできますので参考までに。

投稿2016/09/02 09:37

takasima20

総合スコア7458

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

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

0

コマンド一つにしたい?

コマンドを複数かいたshを作成してください。

そしてそれをコールしてください。

以下はシェルファイル

#vi bk.sh cp copyoption rm removeoption

呼び出し

sh bk.sh

投稿2016/09/04 23:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

コマンド1つだと皆さんの書かれている「mv」になるような気がします。
もしワンライナーで良ければ「&&」や「;」を使うことをおすすめします。

投稿2016/09/04 21:49

編集2016/09/04 21:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問