Linux Bashスクリプトで不正なファイルを検索する

Linux Bashスクリプトで不正なファイルを検索する

私のLinuxフォルダには次のファイルがあります。

abc.txt
test.log
kkk.war
Type1_20160814.xml
Type1_20160624.xml
Type1_20160703.xml
Type1_20160503.xml

Type1ファイルをgzipしたいです。いいえ現在、達人である8月に属します(mtimeは使用できません)。

予想される結果は、次のファイルがgzipで圧縮されていることです。

Type1_20160624.xml
Type1_20160703.xml
Type1_20160503.xml

実際に私は試しました:

files=$(find . -maxdepth 1 -mindepth 1 -not -type f -name "Type1_201608*.xml")
gzip -5 ${files[@]}

ただし、これはType1 gzipファイル(以下の表示)でもありません。これを防ぐにはどうすればよいですか?

abc.txt
test.log
kkk.war

答え1

find . -maxdepth 1 -mindepth 1 -not -type f -name "Type1_201608*.xml"

つまり、現在のディレクトリ()にあるファイルの場合、名前が一致する非正規. -maxdepth 1 -mindepth 1ファイル()が一覧表示されます。-not -type f"Type1_201608*.xml

一致するファイルだけを一覧表示したいので、Type1_*.xmlこのパターンをコマンドにどこかに含める必要があります。通常のファイルで作業したいので-type f

find . -maxdepth 1 -mindepth 1 -type f -name "Type1_*.xml" ! -name "Type1_201608*.xml"

出力を解析しません。find。を使用してください-exec。それがまさにその用途です。

find . -maxdepth 1 -mindepth 1 -type f -name "Type1_*.xml" ! -name "Type1_201608*.xml" -exec gzip -5 {} +

最新のシェルでは、Type1_*.xml除外したいディレクトリやシンボリックリンクとパターンが一致しない場合は、findこれを行う必要はありません。 kshの拡張globパターンを使用できます。バッシュでも使用可能

shopt -s extglob
gzip -5 Type1_!(201608*).xml

zsh では ksh 拡張グローバルモードを有効にできますが、以下を使用することもできます。zsh自身

setopt extended_glob
gzip -5 Type1_*.xml~Type1_201608*

または

gzip -5 Type1_(^201608*).xml

そして、zshで通常のファイルのみが一致することを確認するには、次のようにします。グローバル予選

setopt extended_glob
gzip -5 Type1_(^201608*).xml(.)

答え2

bashシェルオプションセットで使用extglob:

$ shopt -s extglob

$ echo Type1_????!(08)??.xml
Type1_20160503.xml Type1_20160624.xml Type1_20160703.xml

$ gzip Type1_????!(08)??.xml

この!(something)パターンは何でもマッチしますとは別に something

kshこれは(この構文のソース)にも当てはまります。いいえデフォルト以外のオプションを設定します。

答え3

作業ディレクトリで次のコマンドを実行してみたところ、すべてのファイルが圧縮されました。

同じディレクトリで実行

gzip -f $(ls -l | grep Type1 | grep -v $(date+%Y%m) | awk '{print $NF}')

lsの他のディレクトリで実行するには、フォルダ名をパラメータとして追加する必要があります。

gzip -5 $(ls -lrt -d -1 test/* | grep Type1 | grep -v $(date +%Y%m) | awk '{print $NF}')

受信出力

Type1_20160102.xml.gz

1_20160105.xml.gzと入力してください。

1_20160624.xml.gzと入力してください。

1_20160703.xml.gzと入力してください。

1_20160704.xml.gzと入力してください。

1_20160705.xml.gzと入力してください。

このコマンドは、今月のファイルを除き、Type1 ディレクトリ名のすべてのファイルを圧縮します。

関連情報