Команда Bash для проверки наличия нескольких файлов в каталоге.

См. функцию parse_fs_typeв mke2fs.c:

.

  • если тип файловой системы указан явно (с помощью -t), используйте это
  • если инструмент работает на Hurd, используйте «ext2»;
  • если имя программы mke3fs, используйте «ext3»;
  • если имя программы mke4fs, используйте «ext4»;
  • если имя программы начинается с mkfs., используйте суффикс;
  • в противном случае используйте значение по умолчанию, определенное в /etc/mke2fs.conf, если таковое имеется;
  • в противном случае используйте «ext2», если журнал не включен по умолчанию, и в этом случае используйте «ext3».

Результирующая текстовая строка используется для поиска определения файловой системы в /etc/mke2fs.conf(, за исключением «ext2», который обрабатывается внутри ).

Таким образом, ваш mkmkбудет использовать тип файловой системы ext2.

0
12.07.2019, 11:55
2 ответа
shopt -s nullglob

set -- "$WORK_DIR/$SRC_FILE_EXT"*

printf 'There are %d names that match "%s"\n' "$#" "$WORK_DIR/$SRC_FILE_EXT*"

То есть разверните шаблон, соответствующий интересующим вас именам, задав позиционные параметры. Специальная переменная $#будет содержать количество совпавших имен. Установите параметр оболочки nullglobв bash, чтобы шаблон не расширялся, если он вообще не совпадает.

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

shopt -s nullglob

num=0
for name in "$WORK_DIR/$SRC_FILE_EXT"*; do
    [ ! -d "$name" ] && num=$(( num + 1 ))
done

printf 'There are %d non-directories with names that match "%s"\n' "$num" "$WORK_DIR/$SRC_FILE_EXT*"

Использованиеfind:

find "$WORK_DIR" -maxdepth 1 ! -type d -name "$SRC_FILE_EXT*" -exec echo x \; | wc -l

(предполагая, что ваш findзнает о не -стандартном -maxdepthпредикате ). Это вернет количество не -каталогов в $WORK_DIR, имена которых начинаются с $SRC_FILE_EXT.

num=$( find "$WORK_DIR" -maxdepth 1 ! -type d -name "$SRC_FILE_EXT*" -exec echo x \; | wc -l )

printf 'There are %d non-directories with names that match "%s" in "%s"\n' \
    "$num" "$SRC_FILE_EXT*" "$WORK_DIR"

Существует тонкое различие между использованием глобусов оболочки для сопоставления имен и использованием findв том, что findболее строго относится к сопоставлению типов файлов. Утилита findобнаружит символическую ссылку на файл или каталог не как файл или каталог, а как символическую ссылку, в то время как оболочка будет разыменовывать символическую ссылку и проверять то, на что она ссылается.

1
28.01.2020, 02:39

Поскольку вы говорите о «файлах» во множественном числе и префиксе, я предполагаю, что имена файлов содержат $SRC_FILE_EXTс чем-то после него, поэтому вам понадобится шаблон подстановки, например $SRC_FILE_EXT*.

Но это может дать вам несколько совпадений, в то время как test -sпринимает только один аргумент.

Поэтому я предлагаю изменить ваш тест на

if [ "$(find. -name \"${WORK_DIR}/${SRC_FILE_EXT}*\" )" != "" ]; then
0
28.01.2020, 02:39

Теги

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