Como ver se não há saída do comando 'ls * .xls'?

3

Ubuntu 14.04.1.

Eu tenho um script bash, chamado pelo cron a cada 10 minutos, que basicamente procura por arquivos em um subdiretório, depois percorre e processa cada arquivo. Mas como posso verificar se não há arquivos encontrados? Se não houver arquivos encontrados, não quero processá-los, e não quero receber um email pelo cron que diga "nenhum arquivo encontrado", porque o cron é executado a cada 10 minutos. São 144 e-mails por dia dizendo "nenhum arquivo encontrado" que eu não queira obter.

  • A entrada / dir é de minha propriedade e tem permissões completas de rwx.
  • Eu já garanti que os arquivos na entrada / não contêm espaços, graças a outra resposta no Ask Ubuntu.

Aqui está meu script básico.

#!/bin/bash
# Cron requires a full path in $myfullpath
myfullpath=/home/comp/progdir
files='ls $myfullpath/input/fedex*.xlsx'
# How do I check for no files found here and exit without generating a cron email?
for fullfile in $files
do

done

Obrigado! Eu nem sabia o que procurar no Google por isso.

EDIT: Meu script agora é este:

#!/bin/bash
# Script: gocronloop, Feb 5, 2015
# Cron requires a full path to the file.
mydir=/home/comp/perl/gilson/jimv/fedex
cd $mydir/input
# First remove spaces from filesnames in input/
find -name "* *" -type f | rename 's/ /-/g'
cd $mydir
shopt -s nullglob
if [ $? -ne 0 ]; then
    echo "ERROR in shopt"
    exit 1
fi
for fullfile in "$mydir"/input/fedex*.xlsx
    do
    # First remove file extension to get full path and base filename.
    myfile='echo "$fullfile"|cut -d'.' -f1'
    echo -e "\nDoing $myfile..."
    # Convert file from xlsx to xls.
    ssconvert $myfile.xlsx $myfile.xls
    # Now check status in $?
    if [ $? -ne 0 ]; then
        echo "ERROR in ssconvert"
        exit 1
    fi
    perl  $mydir/fedex.pl -input:$mydir/$myfile.xls -progdir:$mydir 
    done
    
por Bulrush 05.02.2015 / 14:41

7 respostas

7

Primeiras coisas primeiro: Não analise ls .

Agora que tiramos isso do caminho, use globbing, juntamente com nullglob :

shopt -s nullglob
for fullfile in "$myfullpath"/input/fedex*.xlsx
do
#.......
done

Geralmente com globbing, se * não corresponder a nada, é deixado como está. Com nullglob , ele é substituído por nada, portanto, uma correspondência falsa não é acionada.

Por exemplo:

$ bash -c 'a=(foo/*); echo ${a[@]}'
foo/*
$ bash -c 'shopt -s nullglob; a=(foo/*); echo ${a[@]}'

$
    
por muru 05.02.2015 / 14:54
2

Deixe find fazer o trabalho pesado por você. Escreva um script que processe um arquivo passado como o primeiro parâmetro, e faça isso no seu crontab:

find /wherever  -iname 'fedex*.xls' -exec your-script "{}" \;

find não gerará nenhuma saída se não encontrar arquivos correspondentes à expressão.

    
por roadmr 05.02.2015 / 23:29
2

Python também parece uma opção confortável, se não estou perdendo o objetivo:

#!/usr/bin/env python3
import subprocess
import os

myfullpath = "/home/jacob/Bureaublad" 
files = [f for f in os.listdir(myfullpath) if f.endswith(".xlsx")]

for f in files:
    cmd = "gedit"
    subprocess.check_call(["/bin/bash", "-c", cmd])
    
por Jacob Vlijm 05.02.2015 / 15:40
1

Se você olhar para link , algo assim deveria funcionar:

cd "$myfullpath/input/"

if test -n "$(shopt -s nullglob; echo fedex*.xlsl)"
then
    for file in fedex*.xlsl
    do 
          fullfile="$myfullpath/input/$file"
          # things
    done 
fi 

... Veja também link

    
por Rmano 05.02.2015 / 14:54
1

Se você está pronto para usar o ls de qualquer maneira, apesar de não ser apropriado para o seu código original, ou se você:

só quer saber se ls não encontrou nenhum arquivo

você pode verificar o código de saída. Um "Nenhum tal arquivo ..." falhará (código de saída 2). Mesmo que ls de um diretório vazio seja bem-sucedido (código de saída 0):

$ ls *.xls
ls: cannot access *.xls: No such file or directory
$ echo $?
2

$ ls
$ echo $?
0
    
por Xen2050 05.02.2015 / 15:18
1
$ if ! ls /tmp/*.bla >/dev/null 2>&1 ; then echo "no meat" ; else echo "have a steak" ; fi
no meat
$ touch /tmp/a.bla
$ if ! ls /tmp/*.bla >/dev/null 2>&1 ; then echo "no meat" ; else echo "have a steak" ; fi
have a steak
    
por user375824 05.02.2015 / 20:20
0

Por que não usar o comando find, colocando um único nome de arquivo em cada linha:

for fullfile in $(find <dir> -name '*.xslx'); do  
# fullfile now contains the full filename, including any spaces  
# process to your heart's content, using double quotes (") around $fullfile to  
#  make sure the spaces are kept intact  
    cp "$fullfile" /new/directory/  
end
    
por Leftie80126 05.02.2015 / 23:02

Tags