100MBを超え、20日以上経過したすべてのファイルを見つけて、対応する.TXTファイルと.txtファイルのみを個別に圧縮したいと思います。

100MBを超え、20日以上経過したすべてのファイルを見つけて、対応する.TXTファイルと.txtファイルのみを個別に圧縮したいと思います。

私はそれを使用しています

find $HOME  -type f -size +100M -mtime +20 -exec zip -m '{}.zip' '{}' \;

このコマンドはすべてのファイルを圧縮します。 *.TXTファイルと*.txtファイルのみを圧縮したいです。私たちが何をすべきか知っていますか?

ベストアンサー1

サフィックスが非標準拡張子-size +100Mの場合、100MB(100,000,000バイト)の代わりに100MiB(104,857,600バイト)よりも厳密に大きいサイズのファイルが選択されます。M(厳密に) 100MBより大きいサイズの場合は必要です-size +100000000c(標準です).

-mtime +20find正確に21日(または呼び出し時にナノ秒)以上のファイルに適用されます。 20日より古いファイルが必要です-mtime +19(少なくともPOSIX準拠の実装findでは、すべてがこれに該当するわけではありません)。

Bourneと同じシェルにあり、そうでないと仮定すると、引用符を引用符で囲まないままにすることはzsh意味$HOMEがありません。ここでは分割+globを呼び出すことは意味がないからです。 POSIXシェル~では"$HOME"

zipそれほどUnixコマンドです。デフォルトでは、ワイルドカードは独自に拡張されるため、というファイルがある場合、実際には*.txtそのディレクトリ内のzip -m '*.txt.zip' '*.txt'すべてのファイルを含むzipファイルが作成されます。txtファイルがexampleというディレクトリにあると、状況が悪化する可能性があります*。この-nwフラグを使用して、これを回避したり、以前のzip形式(.zipなど)をサポートするよりUNIXのコマンドを使用したりできますbsdtar

これにより、find ~渡されたすべてのパスがzip絶対パスになるため、フルパスhome/you/dir/file.txt(...)とともにメンバーが一覧表示されるzipファイルが生成されます。これを防ぐには、BSD / GNU-execdir find述語またはオプションを使用できます。-jzip

findすべての実装{}がから拡張されるわけではありません{}.zip。つまり、{}のパラメータにが単独で存在しない場合です-exec。そうでない場合は、を使用してsh電話をかける必要があります-exec sh -c 'zip -nw -m "$1.zip" -- "$1"' sh {} ';'

ファイル名を一致させるには述語を使用できます-name。あるいは、ファイルを'(' -name '*.txt' -o -name '*.TXT' ')'一致させるために使用することができ、いくつかの実装では、...ファイルも含めることができます。多くの実装では、ファイル名はユーザーロケールの有効なテキストでなければなりません。すべての文字は移植可能な文字セットの一部であるため、ロケールをCに変更して、ファイルパスの残りの部分がユーザーロケールの有効なテキストではない場合でも、その文字で終わるファイルと常に一致することを保証できます。txtTXT-name '*.[tT][xX][tT]'find-iname '*.txt'TxttXTfind-name.txtTXT

だから:

LC_ALL=C find ~ '(' -name '*.txt' -o -name '*.TXT' ')' \
                -type f \
                -size +100000000c \
                -mtime +19 \
                -execdir zip -nw -m '{}.zip' -- '{}' ';'

またはzsh以下を使用してください。

for f (~/**/*.(txt|TXT)(ND.L+100000000m+19)) zip -j -nw -m $f.zip $f

zipは1980年代後半の古いフォーマットであり、今日の標準と比較して低圧縮率です。唯一の利点は、Microsoftオペレーティングシステムでデフォルトでサポートされている唯一の圧縮形式であることです(実際のアーカイブと圧縮の両方を実行し、ここでは後者のみが必要です)。

ここでMicrosoftオペレーティングシステムとの相互運用性が必要ない場合xz。 90年代初頭の製品であっても、同じ圧縮アルゴリズムを使用して圧縮だけを担当するbzip2ので、サイズもより小さくすることができます。これらの機能はすべて複数のファイルを一度に圧縮できるため、コンプレッサーを頻繁に呼び出すことができないため、多くのファイルを圧縮するプロセスがより効率的になります。gzipzip

たとえば、次のようにできます。

xz ~/**/*.(txt|TXT)(ND.L+100000000m+19)

zshシェルからの単一の呼び出しは、これらすべてのファイルの圧縮を向上させますxz


^夏時間による時計の変更は考慮されていないため、カレンダー日付ではなく86400(24×60×60)Unix秒です。

おすすめ記事