🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

1回答

1676閲覧

shell スクリプトで 日付単位で mv させる方法について

EzrealTrueshot

総合スコア389

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2021/03/02 12:28

2019年01月01日14時30分05秒に取得したファイルがこのようにあります。
(ファイル名に日付が書かれています)

test_20190101143005.txt

このようなファイルが大量に下記のようにあります。(2年分くらい)
test_20190101143005.txt
test_20190101152015.txt
test_20190101161025.txt
test_20190101175035.txt
test_20190101184045.txt
test_20190101192055.txt
test_20190101203005.txt



test_20210101203005.txt

ここで、 2020年01月01日15時15分30秒 ~ 2020年07月14日15時30分45秒以前までのものを別ファイルへ mv させたいです。


現在の方法(手動)

mv test_20200101151530 別ファイルディレクトリ名 mv test_2020010116* 別ファイルディレクトリ名 mv test_2020010117* 別ファイルディレクトリ名 mv test_2020010118* 別ファイルディレクトリ名 ・ ・・ mv test_202002* 別ファイルディレクトリ名 mv test_202003* 別ファイルディレクトリ名 mv test_202004* 別ファイルディレクトリ名 mv test_202005* 別ファイルディレクトリ名 mv test_202006* 別ファイルディレクトリ名 mv test_2020070* 別ファイルディレクトリ名 mv test_20200710* 別ファイルディレクトリ名 mv test_20200711* 別ファイルディレクトリ名 mv test_20200712* 別ファイルディレクトリ名 mv test_20200713* 別ファイルディレクトリ名 ・ ・ ・ mv test_20200714153045*

このように、その月・日・時・秒ゴトのファイルすべてをアスタリスクで指定して mv させています。

このように自力で1つ1つやるのではなく、日付ソート的な技を用いて、任意の期間のファイルをワンライナーでごそっと移動させる方法がありましたら知りたいです。


しらべたところ、下記のような方法を見つけたのですが、タイムスタンプで基準をとっているようでしたので、今回のファイル名とは異なるため、無理でした。
https://www.searchman.info/tips/2950.html

ファイル名によってつけられた日付を任意の期間で、mvさせるいい方法をご存知の方いらっしゃいましたらご教示いただけませんでしょうか?

環境 Ubuntu18.04

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

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

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

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

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

Daregada

2021/03/02 12:59 編集

> 2019年01月01日14時30分05秒に取得したファイルがこのようにあります。 (ファイル名に日付が書かれています) と > しらべたところ、下記のような方法を見つけたのですが、タイムスタンプで基準をとっているようでしたので、今回のファイル名とは異なるため、無理でした。 は矛盾していませんか? ファイル名に付けられた日時と、ファイルのタイムスタンプは大幅に異なるのですか? (たとえば、ファイル名に付けられた日時以降に編集を行なっているなど)
EzrealTrueshot

2021/03/02 13:10

はい、大体は合っているのですが、若干ことなっているものもあれば、大幅にことなっているものもあり、 きちんとソートされている状態ではありませんでした。 これにかんしては、記述漏れです。すみませんでした。
Daregada

2021/03/02 13:16

タイムスタンプ(修正日時)は異なっていても、ファイルの作成日時(ctime)はファイル名の日時と一致していませんか? もしそうであれば、findコマンドのnewerctオプションを2つ組み合わせて(awkを使わずに)処理できます。
KojiDoi

2021/03/02 13:38

この件についてはfindなど使うよりawkのほうが直接的・確実かつ簡単ではありませんかね。
guest

回答1

0

ベストアンサー

こんな感じで行けるんじゃないでしょうか。

ls test_*.txt | awk '"test_20200101151530"<=$0 && $0<="test_20200714153045"{print "mv", $0, "otherdir"}' |sh

投稿2021/03/02 12:56

編集2021/03/02 13:32
KojiDoi

総合スコア13692

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

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

EzrealTrueshot

2021/03/02 13:09

ありがとうございます! できました! otherdir 部分は "otherdir" でダブルクォーテーションでくくらないと理由はよくわかりませんが、エラーが出ていました。 awkすごいですね。ほかにどんなことできるのか調べてみようと思います。 ありがとうございました!
KojiDoi

2021/03/02 13:32

すいません、otherdirは定数なのでクォーテーションで括らないといけません。記述ミスです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問