linuxBean14.04(186)指定時間内に更新されたファイルを指定フォルダに抽出する方法

2018-11-29

旧ブログ

t f B! P L

前の関連記事:linuxBean14.04(185)ディレクトリツリー内の一番古いファイルを抽出する方法


findで指定時間内に更新されたファイル一覧を取得する


findコマンドのmtimeオプションまとめ - Qiita

findで時間を指定してファイル一覧を取得する方法はこの解説がわかりやすいです。

今回は15分以内に更新されたファイルを抽出することにします。

FILENAME=public/videos/**/images/*.jpg
find $FILENAME -mmin -15

これでカレントディレクトリにあるpublic/videosディレクトリの下にあるimagesディレクトリ内のjpgファイルのうち15分以内に更新されたファイルを取得できます。
pq@pq-VirtualBox:~/_tmp$ FILENAME=public/videos/**/images/*.jpg
pq@pq-VirtualBox:~/_tmp$ find $FILENAME -mmin -15
public/videos/20181129/images/UML.jpg
public/videos/20181129/images/UML2.jpg
2つのファイルが取得できました。

findで抽出したファイルを指定ディレクトリにコピーする


FILENAME=public/videos/**/images/*.jpg
UPLOADDIR=uploads
mkdir -p $UPLOADDIR
find $FILENAME -mmin -15 -exec cp -t $UPLOADDIR {} +

これでカレントディレクトリにuploadsディレクトリを作成してそこにfindで取得したファイル一覧のファイルをコピーできました。

find $FILENAME -mmin -15 -exec cp {} $UPLOADDIR \;

最後のコマンドはこれでも同じ結果になりますが、これはfindで見つけたファイルを一つずつコピーすることになるので、抽出するファイル数が大量になると時間がかかります。

find $FILENAME -mmin -15 -exec cp {} $UPLOADDIR +

これはうまく動きません。

ということで、コピー先フォルダを-tオプションで指定して、{} +を最後に持ってくる方法で落ち着きました、、、

と思ったら、これは2つの問題が判明しました。

一つは**は*と同じ働きしかしません。

これはshopt -s globstarを実行することで解決しました(Bash 拡張の globstar ファイルパターンマッチ(`**`によるマッチ)のメモ - Qiita)。

もうひとつはワイルドカードにマッチするファイル数が多すぎると「引数が長すぎます」といわれて動かないことです。

shopt -s globstar
FILENAME=public/videos/**/*.jpg
UPLOADDIR=uploads
mkdir -p $UPLOADDIR
find $FILENAME -mmin -15 | xargs cp -t $UPLOADDIR

これもまだfindの引数が長すぎますと言われます。

findからcpに渡す引数が長すぎるのではなく、find自体の引数が長すぎるということのようです。

ワイルドカードでマッチする引数がたくさんあり過ぎるということです。

DIRNAME=public/videos
UPLOADDIR=uploads
mkdir -p $UPLOADDIR
find $DIRNAME  -mmin -15 -type f  -name "*.jpg"  -exec cp -t $UPLOADDIR {} +

これで解決しました。

ファイル名のワイルドカードはシェルで展開されないように-nameの引数でクウォーテーションをつけて指定しています。

参考にしたサイト


findコマンドのmtimeオプションまとめ - Qiita
更新時期を指定してファイル一覧を取得する方法。

find の -exec optionの末尾につく \; と + の違い。 - Qiita
-exec {} \; と -exec {} + の違いの解説。

find-xargsでmvやcpに引数を渡す方法 - ケーズメモ
-execやパイプでまとめて引数を渡せるのは最後の位置引数だけのようです。

linux - find and copy file using Bash - Stack Overflow
-exec {} \; まで作って力尽きたようです。

Bash 拡張の globstar ファイルパターンマッチ(`**`によるマッチ)のメモ - Qiita
shopt -s globstarをしないと**が展開されません。

次の関連記事:linuxBean14.04(187)ローカルフォルダからGoogleフォトにアップロードする方法

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ