私の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 ディレクトリ名のすべてのファイルを圧縮します。