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

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

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

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

Q&A

解決済

3回答

434閲覧

複数ディレクトリ配下へのファイルのコピー処理

sho88

総合スコア19

sh

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

0グッド

0クリップ

投稿2019/04/17 04:48

aaaa、aaaa_copy01、aaaa_copy02の3つのディレクトリがあります。
aaaaに画像ファイル(.jpg)が複数入っており、aaaa_copy01、aaaa_copy02ディレクト内にファイルはありません。

aaaaディレクトリ内の画像ファイル(.jpg)を、aaaa_copy01、aaaa_copy02の両方のディレクトリ内へコピー(移動でも可)したいと考えていますが、
シェルスクリプトで一括処理することは可能でしょうか。
欲を言えば、aaaaディレクトリはコピー処理後、削除したいです。
++++++++++++++++++++++++++++++++++
aaaa、aaaa_copy01、aaaa_copy02
++++++++++++++++++++++++++++++++++

ご相談した理由は、以下のような構成のディレクトリが大量に存在しているため、一括で処理したいためです。
先頭のディレクトリ内に複数の画像ファイルがあり、それを*_copy01、*_copy02へコピーする処理は共通です。

++++++++++++++++++++++++++++++++++
aaaa、aaaa_copy01、aaaa_copy02
bbbb、bbbb_copy01、bbbb_copy02
cccc、cccc_copy01、cccc_copy02
++++++++++++++++++++++++++++++++++

ご教示頂けるとありがたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ディレクトリがaaaaでコピー先がaaaa_*の場合は下記のワンライナーでコピー削除できます。
また、コピーが失敗した際は元ディレクトリを削除しません。

bash

1$ echo aaaa | xargs -I@ sh -c 'echo @_*|xargs -n1 cp -r @/* && rm -r @'

aaaaの部分をbbbbなど任意のディレクトリに変更してください。

コマンドの動作確認について

コマンドが正しく動くかについては、空のディレクトリで下記コマンドを実行して試しました。

bash

1## ファイルが無いことを確認 2$ ls 3 4## ディレクトリを作成 5$ mkdir aaaa{,_copy{01,02}} 6 7## ファイルを作成 8$ touch aaaa/sample{1..3} 9 10##ファイルがaaaaディレクトリ配下のみに作成されていることを確認 11$ find 12. 13./aaaa 14./aaaa/sample1 15./aaaa/sample2 16./aaaa/sample3 17./aaaa_copy01 18./aaaa_copy02 19 20## aaaa からaaaa_copy01 とaaaa_copy02 にコピー、成功後削除 21$ echo aaaa | xargs -I@ sh -c 'echo @_*|xargs -n1 cp -r @/* && rm -r @' 22 23## 正しく実行されているかの確認 24$ find 25. 26./aaaa_copy01 27./aaaa_copy01/sample1 28./aaaa_copy01/sample2 29./aaaa_copy01/sample3 30./aaaa_copy02 31./aaaa_copy02/sample1 32./aaaa_copy02/sample2 33./aaaa_copy02/sample3 34

投稿2019/04/17 08:18

編集2019/04/25 08:31
amanoese

総合スコア132

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

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

sho88

2019/04/20 13:25

amanoese様、ご教示頂きありがとうございます。やりたかった処理をすることができました。いつもありがとうとざいます。またどうぞよろしくお願いいたします。
guest

0

こう云う感じでしょうか。

for a in aaaa bbbb cccc;do cp $a/*.jpg $a/$a_copy01 cp $a/*.jpg $a/$a_copy02 rm $a/*.jpg done

テスト用のディレクトリで問題ないか確かめてから本番に取り掛かってください。

投稿2019/04/17 06:07

KojiDoi

総合スコア13671

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

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

sho88

2019/04/20 13:23

KojiDoi様、ご教示いただきありがとうございます。またいつも回答頂きありがとうございます。無事解決できました。今後ともどうぞよろしくお願いいたします。
guest

0

いろんな方法があると思いますが、無理やりワンライナーでやるならこんな感じでしょうか。

bash

1$ echo aaaa_copy01 aaaa_copy02 | xargs -n 1 cp aaaa/*.jpg

あ、消してないな。
cpをmvにすると、aaaa_copy02にはコピーできないので、後で消してください。

投稿2019/04/17 06:05

rogueref

総合スコア727

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

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

sho88

2019/04/20 13:19

rogueref様、ご教示いただきありがとうございました。無事解決できました。またどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問