Как узнать, не выводится ли команда `ls * .xls`?

Ну, насколько я знаю, вы не можете, разрешение окна терминала основано на пропорциях символов ... Поэтому, если вы измените размер шрифта, окно терминала изменится на размер, чтобы оно соответствовало доля этого шрифта ...

Сначала это звучит немного глупо, но, учитывая, что терминал просто отображает только текстовые символы, имеет смысл, если окно имеет размер по пикселям, вы бы часто в конечном итоге с пустым пространством, когда размер окна точно не соответствует границе символа ...

1
задан 5 February 2015 в 19:07

6 ответов

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

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

find не будет генерировать никакого вывода, если он не найдет файлы, соответствующие выражению. [ ! d1]

2
ответ дан 23 May 2018 в 23:30

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
ответ дан 23 May 2018 в 23:30
  • 1
    Если вы ничего не делаете, если len (files) равно нулю, вы можете опустить эту строку / условие; for f in files ничего не сделает, если files пуст; и files гарантированно быть итерабельным из-за того, что он определяется как понимание списка. Еще одна линия! \ o / Кроме того, вместо subprocess.popen я предлагаю использовать subprocess.check_call или subprocess.check_output; Семантика Popen более сложна, и вы обязаны протекать файловые дескрипторы и / или покидать процессы зомби. – roadmr 6 February 2015 в 02:31
  • 2
    @roadmr совершенно верно, конечно. Было бы быстро указать, что python может иметь преимущества в таком случае. Спасибо, что упомянул. – Jacob Vlijm 6 February 2015 в 09:59

Если вы посмотрите на 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 

... Посмотрите также на https://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any-matches-in-bash

1
ответ дан 23 May 2018 в 23:30
  • 1
    Кто-то должен добавить ls * в черный список для вопросов и автоматически перенаправить на эту страницу вики. – muru 5 February 2015 в 17:58
  • 2
    Это не похоже на синтаксис bash. – Bulrush 5 February 2015 в 19:23
  • 3
    Фрагмент Романо выглядит так же, как сценарий оболочки bash. – Michael Kjörling 5 February 2015 в 20:02
  • 4
    ... это глупо и неэффективно (из-за подоболочки) и не работает во всех угловых случаях (если у вас были имена файлов, которые содержали только пробелы, это отрицало бы их существование), но это, безусловно, правильный синтаксис. (Если вы хотите эффективно проверить, существуют ли какие-либо файлы: files=( fedex*.xls ); if (( ${#files[@]} )) && [[ -e $files ]] ; then echo "Files exist"; fi - не требуется дорогостоящая подоболочка, и это приложит дополнительные усилия для работы с nullglob либо вкл., Либо выключить). – Charles Duffy 6 February 2015 в 01:02
  • 5
    Да, @CharlesDuffy правилен, и ответ муру намного лучше. Я оставляю ответ только для ссылки на вики Грега ;-). – Rmano 6 February 2015 в 12:45

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

просто хотите узнать, не нашли ли ls files

вы можете проверить его код выхода. «Нет такого файла ...» не удастся (код выхода 2). Хотя даже пустая директория ls будет успешной (код выхода 0):

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

$ ls
$ echo $?
0
1
ответ дан 23 May 2018 в 23:30
  • 1
    Нет, мне не нужно использовать ls, поскольку он появляется. Ls генерирует сообщение об ошибке, если нет файлов для обработки во вводе /, который генерирует электронное письмо cron, и я не хочу, чтобы электронные письма cron заполняли мой почтовый ящик каждый 10 минут. – Bulrush 5 February 2015 в 18:22
  • 2
    Правда. Но это отвечает на ваш вопрос «Как узнать, нет ли результата из команды ls *.xls? / Как проверить, нет ли найденных файлов? " Не используйте ls в качестве исходного кода, но если вы хотите сначала проверить, есть ли какие-либо файлы (по какой-то другой причине, вам нужен ответ «да / нет» и т. д.). – Xen2050 5 February 2015 в 18:26
  • 3
    Я ценю ваш вклад, но я узнал, что синтаксический анализ ls на самом деле является серьезной проблемой. Поэтому в этом случае я хотел бы узнать, как сделать это лучше, быстрее и сильнее. :) – Bulrush 5 February 2015 в 19:05
  • 4
    @ Xen2050 Это был действительно один ответ на фактический вопрос, который у меня был, так что спасибо! – Dmitri 6 February 2015 в 12:00
[F1]
1
ответ дан 23 May 2018 в 23:30
  • 1
    Это всего лишь повторение предыдущего ответа без форматирования кода – David Foerster 5 February 2015 в 23:35
  • 2
    @DavidFoerster Я не вижу, как это копия любых существующих ответов. – Seth♦ 6 February 2015 в 02:12
  • 3
    Он также проверяет статус выхода ls, как и мой ответ, только с использованием оператора if (и несколько неясной аналогии с мясом) – Xen2050 6 February 2015 в 13:24

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

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
ответ дан 23 May 2018 в 23:30
  • 1
    По той же причине я говорю «Не разбирайте». – muru 6 February 2015 в 06:23
  • 2
    find хорошо сочетается с xargs, особенно с вариантами с нулевым завершением, см. man find или man xargs – Xen2050 6 February 2015 в 13:13

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

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