Linux Localizar arquivo com negação no Bash Script

1

Na minha pasta linux existem os seguintes arquivos:

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

Eu quero gzip arquivos Type1 que NÃO pertencem ao mês atual, que é agosto (não consigo usar mtime).

Resultado esperado, os seguintes arquivos gzip-ed:

Type1_20160624.xml
Type1_20160703.xml
Type1_20160503.xml

Na verdade eu tentei:

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

MAS, também gzip arquivos que não Type1 (como seguinte), como posso evitar que?

abc.txt
test.log
kkk.war
    
por hades 17.08.2016 / 10:10

3 respostas

0

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

Isso significa: para os arquivos no diretório atual ( . -maxdepth 1 -mindepth 1 ), liste os arquivos que não são regulares ( -not -type f ) e que tenham um nome correspondente a "Type1_201608*.xml .

Como você deseja listar apenas arquivos que correspondam a Type1_*.xml , seu comando terá que incluir esse padrão em algum lugar! E como você quer atuar em arquivos regulares, não negue -type f .

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

Não analise a saída de find . Use -exec , é para isso.

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

Com os shells modernos, se o padrão Type1_*.xml não corresponder a nenhum diretório ou a qualquer link simbólico que você queira excluir, você não precisará de find para isso. Você pode usar padrões de glob extended ksh, que são também disponíveis no bash .

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

Em zsh, você pode ativar padrões de globos estendidos ksh, mas também pode usar / a>.

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

E, em zsh, se você quiser garantir que apenas arquivos regulares sejam correspondidos, use um qualificador glob .

setopt extended_glob
gzip -5 Type1_*.xml~Type1_201608*(.)
    
por 18.08.2016 / 03:27
0

Eu tentei executar o comando abaixo no diretório de trabalho e todos os arquivos foram gziped.

para executar no mesmo diretório

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

para executar a partir do diretório diferente em ls, precisamos adicionar o nome da pasta como argumento

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

Saída recebida

Type1_20160102.xml.gz

Type1_20160105.xml.gz

Type1_20160624.xml.gz

Type1_20160703.xml.gz

Type1_20160704.xml.gz

Type1_20160705.xml.gz

this command's will zip all the files in directory name Type1 excluding current month files

    
por 25.01.2017 / 05:55
0

Usando bash com o conjunto de opções extglob shell:

$ shopt -s extglob

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

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

O padrão !(something) corresponderá a qualquer coisa exceto something .

Isso também funciona em ksh93 sem definir qualquer opção não padrão.

    
por 25.01.2017 / 13:22

Tags