私はそれを使用しています
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 +20
find
正確に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
述語またはオプションを使用できます。-j
zip
find
すべての実装{}
がから拡張されるわけではありません{}.zip
。つまり、{}
のパラメータにが単独で存在しない場合です-exec
。そうでない場合は、を使用してsh
電話をかける必要があります-exec sh -c 'zip -nw -m "$1.zip" -- "$1"' sh {} ';'
。
ファイル名を一致させるには述語を使用できます-name
。あるいは、ファイルを'(' -name '*.txt' -o -name '*.TXT' ')'
一致させるために使用することができ、いくつかの実装では、...ファイルも含めることができます。多くの実装では、ファイル名はユーザーロケールの有効なテキストでなければなりません。すべての文字は移植可能な文字セットの一部であるため、ロケールをCに変更して、ファイルパスの残りの部分がユーザーロケールの有効なテキストではない場合でも、その文字で終わるファイルと常に一致することを保証できます。txt
TXT
-name '*.[tT][xX][tT]'
find
-iname '*.txt'
Txt
tXT
find
-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
ので、サイズもより小さくすることができます。これらの機能はすべて複数のファイルを一度に圧縮できるため、コンプレッサーを頻繁に呼び出すことができないため、多くのファイルを圧縮するプロセスがより効率的になります。gzip
zip
たとえば、次のようにできます。
xz ~/**/*.(txt|TXT)(ND.L+100000000m+19)
zsh
シェルからの単一の呼び出しは、これらすべてのファイルの圧縮を向上させますxz
。
^空夏時間による時計の変更は考慮されていないため、カレンダー日付ではなく86400(24×60×60)Unix秒です。