Как видеть если никакой вывод от 'ls *.xls' команда?

Ubuntu 14.04.1.

У меня есть сценарий удара, названный кроном каждые 10 минут, который в основном ищет файлы в subdir, затем циклы через, и обработайте каждый файл. Но как я проверяю, нет ли никаких найденных файлов? Если нет никаких файлов, найденных, что я не хочу обрабатывать их, и я не хочу получать электронное письмо через крон, который не говорит "файлов, найденных", потому что крон работает каждые 10 минут. Это - 144 электронных письма в день, не говоря "файлов, найденных", который я не хочу получать.

  • Вход / dir принадлежит мне и имеет полные rwx полномочия.
  • Я уже гарантировал, что файлы во входе / не содержат пробелы, благодаря другому ответу на Спрашивают Ubuntu.

Вот мой основной сценарий.

#!/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

Спасибо! Я даже не знал, что погуглить для этого.

Править: Мой сценарий - теперь это:

#!/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 $1 $mydir/fedex.pl -input:$mydir/$myfile.xls -progdir:$mydir 
    done
3
задан 5 February 2015 в 18:07

7 ответов

Первые вещи сначала: не анализируют ls .

Теперь, когда у нас есть это из пути, используйте globbing, alongwith nullglob:

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

Обычно с globbing, если * не соответствует ничему, которое это оставляют, как. С nullglob, это ничем не заменяется, таким образом, ложное соответствие не инициировано.

, Например:

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

$
7
ответ дан 1 December 2019 в 12:57

Если Вы - тупик при использовании ls так или иначе, несмотря на он - непригодность для Вашего исходного кода, или если Вы:

просто хочу узнать, не нашел ли ls файлов

, Вы могли бы проверить, что это - код выхода. "Никакой такой файл..." не перестанет работать (код выхода 2). В то время как даже пустой каталог ls успешно выполнится (код выхода 0):

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

$ ls
$ echo $?
0
2
ответ дан 1 December 2019 в 12:57

Позвольте find, делают тяжелую работу для Вас. Запишите сценарий, который обрабатывает файл, переданный как первый параметр, затем сделайте это в своем crontab:

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

find не генерирует вывода, если он не найдет файлы, соответствующие выражению.

2
ответ дан 1 December 2019 в 12:57

Python кажется удобной опцией также, если я не упускаю суть:

#!/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])
2
ответ дан 1 December 2019 в 12:57

Если Вы смотрите https://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any-matches-in-bash, что-то как этот должно работать:

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 

... Посмотрите также http://mywiki.wooledge.org/ParsingLs

1
ответ дан 1 December 2019 в 12:57
$ 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
1
ответ дан 1 December 2019 в 12:57

Почему бы не использовать команду находки, помещая единственное имя файла на каждую строку:

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
0
ответ дан 1 December 2019 в 12:57

Другие вопросы по тегам:

Похожие вопросы: