Использование ls для поиска файлов, которые заканчиваются символом, игнорируя расширение

Я дам вам выдержку из кода для variety, которая делает это. Эта версия кода просто вставляет путь к изображению, а не включает изображение в файл edj.

OUTPUT_DIR="$HOME/.e/e/backgrounds"

TEMPLATE='
images { image: "@IMAGE@" USER; }
collections {
  group {
  name: "e/desktop/background";
  data { item: "style" "4"; item: "noanimation" "1"; }
  max: @WIDTH@ @HEIGHT@;
  parts {
    part {
    name: "bg";
    mouse_events: 0;
    description {
      state: "default" 0.0;
      aspect: @ASPECT@ @ASPECT@;
      aspect_preference: NONE;
      image { normal: "@IMAGE@"; scale_hint: STATIC; }
    }
    }
  }
  }
}
'

OFILE="$OUTPUT_DIR/variety_wallpaper_$RANDOM"

DIMENSION="$(identify -format "%w/%h" "$WP")"

if [ ! -z "$DIMENSION" ]; then
    WIDTH=$(echo $DIMENSION | cut -d/ -f1)
    HEIGHT=$(echo $DIMENSION | cut -d/ -f2)
    IMAGE="$(echo "$WP" | sed 's/[^[:alnum:]_-]/\\&/g')"

    if [ -z "$HEIGHT" -o "$HEIGHT" = "0" ]; then
        ASPECT="0.0"
    else
        ASPECT=$(echo "scale=9; $DIMENSION" | bc)
    fi
fi

printf "%s" "$TEMPLATE" | \
sed "s/@ASPECT@/$ASPECT/g; s/@WIDTH@/$WIDTH/g; s/@HEIGHT@/$HEIGHT/g; s|@IMAGE@|$IMAGE|g" > "$OFILE.edc"
edje_cc "$OFILE.edc" "$OFILE.edj" 2>/dev/null
rm "$OFILE.edc"

Полный исходник: http://bazaar.launchpad.net/~peterlevi/variety/trunk/view/head:/data/scripts/set_wallpaper

Если вы хотите вставить изображение, вы можете сделать следующее, я получил это, создав обои через enlightenments UI и декомпилировав их с помощью edje_decc

images { image: "1920x1080.png" LOSSY 90; }
collections {
  group { name: "e/desktop/background";
  data { item: "style" "4"; }
    data.item: "noanimation" "1";
    parts {
      part { name: "bg"; mouse_events: 0;
        description { state: "default" 0.0;
          aspect: 1.777777778 1.777777778; aspect_preference: NONE;
          image { normal: "1920x1080.png";  scale_hint: STATIC; }
        }
      } 
    } 
  }
}

Затем вы собираете тему с помощью edje_cc -id . -fd . e_bgdlg_new.edc -o 1920x1080.edj при условии, что вышеуказанное было в файле e_bgdlg_new.edc и ваше изображение было в том же каталоге, где вы вызывали скрипт

1
11.09.2018, 10:44
3 ответа

что-то=

 |grep -e ".*t\.[^.]*" -e "^[^.]*t$"
1
27.01.2020, 23:42

Если вы используете оболочку bash, вы можете использовать опцию extglobдля создания сложного фильтра. Например:

Решение:

bash$ shopt -s extglob

bash$ ls
other.txt  test  test.ascii  test.txt

bash$ ls *@(t.*|[^.]?[[:alnum:]]t)
test  test.ascii  test.txt

Пояснение:

ШАБЛОН1 (t.*)соответствует любому файлу, оканчивающемуся на «t», за которым следует расширение файла:

bash$ ls *@(t.*)
test.ascii  test.txt

ШАБЛОН2 ([^.]?[[:alnum:]]t)соответствует любому файлу, который НЕ имеет точки, за которой следует ноль или более буквенно-цифровых символов и который заканчивается на "t". Это соответствует файлам, которые не имеют расширения файла :

.
bash$ ls *@([^.]?[[:alnum:]]t)
test

Глоб @(PATTERN1|PATTERN2)соответствует любому шаблону ровно один раз. Комбинированный шаблон отфильтровывает только то, что мы ищем.

Для получения дополнительной информации о шаблонах bash см.:http://wiki.bash-hackers.org/syntax/pattern

0
27.01.2020, 23:42

Предполагается, что вам нужны файлы только с одной точкой (расширение )и
Предполагая, что вам нужно выполнить поиск в текущем каталоге (./ ), вы можете использовать :

.
$ find. -maxdepth 1 -type f -regex './[^.]*t\(\.[^.]*\)?'
./test.txt
./test.ascii
./test

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

$ printf '%s\n' * | grep -e ".*t\.[^.]*" -e "^[^.]*t$"
test
test.ascii
test.txt
tt

Чтобы разрешить имена файлов с символами новой строки, используйте (GNU grep):

$ printf '%s\0' * | grep -ze ".*t\.[^.]*" -e "^[^.]*t$" | xargs -0
test test.ascii test.txt tt
0
27.01.2020, 23:42

Теги

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