Проверьте, имеет ли папка определенный тип существующего файла

Я вполне уверен, что Ваш обратный вызов крышки будет названным каждый раз, когда крышка закрыта, а также открыта.

sleep.sh файл здесь указывает:

# if launched through a lid event and lid is open, do nothing
echo "$1" | grep "button/lid" && grep -q open /proc/acpi/button/lid/LID/state && exit 0

"крышка открытый" сценарий является одним Вашим сценарием, не проверяет на...

Вы могли быстро протестировать это путем повторения некоторых параметров к файлу журнала

7
03.06.2014, 02:22
4 ответа

В Bash просто используйте

shopt -s nullglob
for pdfFile in *.java;do
    # your code goes here
done

Этот синтаксис предназначен для Bourne-подобных оболочек; опция nullglob специфична для bash. Скобки, которые вы использовали ({}), предназначены для оболочек в стиле C.

shopt -s nullglob устанавливает опцию nullglob, которая в основном указывает Bash, что глобы, которые не смогли найти соответствия, должны быть расширены в нулевую строку. По умолчанию, если *.java не совпадает, он расширяется в себя (звездочка остается).

4
27.01.2020, 20:17

Еще одна проблема с примером кода, вы обычно хотите использовать двойные кавычки на любом из итераторов , поскольку вы используете их в цикле for.

Ваш код:

for javaFile in *.java ;
    {
        echo "The file $javaFile has : " >> ~/Desktop/externalServers.txt
        grep -E '^[^/]{2}.*http' $javaFile >> ~/Desktop/externalServers.txt     

        grep -E '^[^/]{2}.*ftp' $javaFile  >> ~/Desktop/externalServers.txt

Должен быть:

for javaFile in *.java ; do
        echo "The file $javaFile has : " >> ~/Desktop/externalServers.txt
        grep -E '^[^/]{2}.*http' "$javaFile" >> ~/Desktop/externalServers.txt

        grep -E '^[^/]{2}.*ftp' "$javaFile"  >> ~/Desktop/externalServers.txt
2
27.01.2020, 20:17

подход Джозефа nullglob является наиболее элегантным, но если вы не хотите или не можете его использовать (например, оболочка, отличная от bash или более старая версия bash), вы также можете сделать это (при условии, что имена ваших файлов не содержат символов новой строки):

file="~/Desktop/externalServers.txt"
while IFS= read -r javaFile
do
  echo "The file $javaFile has : " >> "$file"
  grep -E '^[^/]{2}.*http' "$javaFile" >> "$file"
  grep -E '^[^/]{2}.*ftp' "$javaFile"  >> "$file"

  echo "----------------------------------------" >> "$file"
  ## The -i flag enables in-place editing so you don't need
  ## to fiddle about with temp files.
  sed -i -e "s/[[:space:]]\+/ /g" "$file"
  sed -i -n '/[^[:space:]]/p' "$file"
done < <(find . -maxdepth 1 -name '*.java')

IFS = устанавливает пустой разделитель полей ввода, чтобы можно было правильно работать с именами файлов, содержащими пробелы, а параметр -r для читать означает, что обратная косая черта не обрабатываются особым образом (в случае, если ваши имена файлов могут содержать их). Конструкция <(команда) называется подстановкой процесса и представляет собой способ передачи вывода одной команды в качестве ввода другой.

Я ввел переменную $ file , поэтому вам не нужно редактировать каждую строку, если вы когда-либо захотите изменить имя выходного файла.

Обратите внимание, что я использовал флаг -i для sed, который позволяет редактировать исходный файл и устраняет необходимость во временных файлах. Также обратите внимание, что нет причин делать rm foo.txt; mv bar.txt foo.txt , вы всегда можете просто сделать mv bar.txt foo.txt , и это перезапишет целевой файл. Теперь я понятия не имею, что эта команда должна была делать:

sed 's/^\n//' ~/Desktop/externalServers.txt >> ~/Desktop/externalServersTemp.txt

Я предполагаю, что вы хотите, чтобы она удаляла пустые строки, но это не сработает, поэтому я изменил ее выше с помощью

sed -i -n '/[^[:space:]]/p' ~/Desktop/externalServers.txt

- n подавляет стандартное поведение sed при печати каждой строки, / [^ [: space:]] / будет соответствовать любым строкам, которые соответствуют любому непробельному символу и p в конце означает, что будут напечатаны эти строки и только эти строки. Если это не то, что вы хотели сделать с помощью команды sed , дайте мне знать, и я внесу необходимые изменения.

0
27.01.2020, 20:17

Моя собственная версия вашего сценария, вероятно, выглядела бы так:

set -- *.java
test -e "$1" && {
    fortyequals=$(printf '%040d\n' | tr 0 \=)
    for javaFile do
        printf '%s\nIn file: %s\n%s\n' \
            $fortyequals "$javaFile" $fortyequals
        grep -E '^[^/]{2}.*(ftp|http)' "$javaFile"       
    done 
} >>~/Desktop/externalservers.txt

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

set -- *.java
test -e "$1" &&
    for javaFile do
#       ...iterate on $javaFile here...
    done

Другим преимуществом является то, что вы не только сохраняете последнее значение $javaFile после цикла, вы также сохраняете все значения, которые $javaFile когда-либо имели в $@. Это делает возможным следующее:

...
done

echo "The previous for loop processed $# files."

echo "The first file processed was:"
printf "///\t'%s'\t///\n" "$1"

echo "The last file processed was:"
printf "///\t'%s'\t///\n" "$javaFile"

echo 'All files processed in the for loop were:'
printf "///\t'%s'\t///\n" "$@"

И если вам действительно нравятся {curlies }, вы можете использовать их - даже в bash (хотя они и не нужны) - но вы должны разграничить два shell зарезервированных слова } и done, например:

for ... do {
...
} ; done

Хотя я рекомендую заключить весь блок - вокруг цикла for и любой последующей обработки - в завитки, зависящие от && зарезервированных слов, например:

set -- *.java
test -e "$1" && {
    for ... done
#   ...further processing on $@...
} 

Оглядываясь назад, я думаю, что могу помочь и с regex. .. Похоже, что мы ищем строки, содержащие слова http и/или ftp, которые не начинаются с двух //.

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

Итак, вместо этого мы могли бы просто записывать for вывод цикла непосредственно в outfile, чтобы сохранить дескриптор записи для ~/Desktop/externalservers.txt до завершения цикла, что позволит избежать записи пустых строк. Может быть так:

for ... done >>outfile

Или

{ grouped ; command ; list ; } >>outfile

По крайней мере, я могу сказать, что это утверждение, вероятно, не делает того, что вы хотите:

sed 's/^\n//' $file

sed является \newline delimited - невозможно встретить \newline как ^первый символ в строке. Вы можете получить \newlines в пространство шаблонов sed различными способами, но никогда без некоторой обработки.

4
27.01.2020, 20:17

Теги

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