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(.)

おすすめ記事