Сценарий Bash для проверки расширений файлов в каталоге

Это не ответ, но эта информация может помочь другим людям.

Поэтому я решил переустановить -Ubuntu Server. Я также решил временно удалить адаптер беспроводной сети -, чтобы уменьшить количество переменных. Когда появился экран установки, я решил выбрать Установить сервер Ubuntu с ядром HWE-вместо Установить сервер Ubuntu . После завершения процесса установки все, казалось, работало нормально.

Вот результат дляsudo lshw -c network:

*-network
     description: Ethernet interface
     product: Qualcomm Atheros
     vendor: Qualcomm Atheros
     physical id: 0
     bus info: pci@0000:05:00.0
     logical name: enp5s0
     version: 10
     serial: xx:xx:xx:xx:xx:xx
     size: 1Gbit/s
     capacity: 1Gbit/s
     width: 64 bits
     clock: 33MHz
     capabilities: pm pciexpress msi msix bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
     configuration: autonegotiation=on broadcast=yes driver=alx duplex=full ip=XXX.XXX.XXX.XXX latency=0 link=yes multicast=yes port=twisted pair speed=1Gbit/s
     resources: irq:19 memory:ef000000-ef03ffff ioport:e000(size=128)

Выходы для sudo lspci -nn | grep ethи sudo modprobe -v alxбыли пусты.

Вот результат дляsudo ip a:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd xx:xx:xx:xx:xx:xx
    inet XXX.XXX.XXX.XXX/XX brd XXX.XXX.XXX.XXX scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/xx scope link
       valid_lft forever preferred_lft forever

Я собираюсь повторно -установить Ubuntu Server снова (без HWE ), просто чтобы посмотреть, не вызывает ли это проблему.

ОБНОВЛЕНИЕ

Я снова установил Ubuntu Server -, на этот раз без ядра HWE.

Результаты те же.

Вот результат дляsudo lshw -c network:

*-network UNCLAIMED
  description: Ethernet controller
  product: Qualcomm Atheros
  vendor: QUalcomm Atheros
  physical id: 0
  bus info: pci@0000:05:00.0
  version: 10
  width: 64 bits
  clock: 33MHz
  capabilities: pm pciexpress msi msix bus_master cap_list
  configuration: latency=0
  resources: memory:ef000000-ef03ffff ioport:e000(size=128)

Выходные данные для sudo lspci -nn | grep ethневерны.

Вот результат дляsudo lspci:

00:00.0 Host bridge: Intel Corporation Sky Lake Host Bridge/DRAM Registers (rev 07)
00:02.0 VGA compatible controller: Intel Corporation Sky Lake Integrated Graphics (rev 06)
00:08.0 System peripheral: Intel Corporation Sky Lake Gaussian Mixture Model
00:14.0 USB controller: Intel Corporation Device a2af
00:16.0 Communication controller: Intel Corporation Device a2ba
00:17.0 SATA controller: Intel Corporation Device a282
00:1b.0 PCI bridge: Intel Corporation Device a2e9 (rev f0)
00:1b.4 PCI bridge: Intel Corporation Device a2eb (rev f0)
00:1c.0 PCI bridge: Intel Corporation Device a292 (rev f0)
00:1c.3 PCI bridge: Intel Corporation Device a293 (rev f0)
00:1c.4 PCI bridge: Intel Corporation Device a294 (rev f0)
00:1c.5 PCI bridge: Intel Corporation Device a295 (rev f0)
00:1c.6 PCI bridge: Intel Corporation Device a296 (rev f0)
00:1c.7 PCI bridge: Intel Corporation Device a297 (rev f0)
00:1d.0 PCI bridge: Intel Corporation Device a298 (rev f0)
00:1f.0 ISA bridge: Intel Corporation Device a2c4
00:1f.2 Memory controller: Intel Corporation Device a2f0
00:1f.3 Audio device: Intel Corporation Device a2f0
00:1f.4 SMBus: Intel Corporation Device a2a3
01:00.0 USB controller: ASMedia Technology Inc. Device 2142
03:00.0 PCI bridge: Integrated Technology Express, Inc. Device 8892 (rev 71)
05:00.0 Ethernet controller: Qualcomm Atheros Device e0b1 (rev 10)

Вот результат дляsudo modprobe -v alx:

insmod /lib/modules/4.4.0-87-generic/kernel/drivers/net/mdio.ko
insmod /lib/modules/4.4.0-87-generic/kernel/drivers/net/ethernet/atheros/alx/alx.ko

Вот результат дляsudo ip a:

1: lo <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
  inet6 ::1/128 scope host
    valid_lft forever preffered_lft forever

Если у кого-то есть что сказать, поделитесь.

0
25.02.2020, 19:30
5 ответов

Попробуйте:

#!/bin/bash
txtnum=0
shnum=0

for file in /some/dir/*;do
  if [[ "${file}" =~ \.txt$ ]];then
    txtnum=$((txtnum+1))
  elif [[ "${file}" =~ \.sh$ ]];then
    shnum=$((shnum+1))
  fi
done

echo "Number of files with.txt extention:${txtnum}"
echo "Number of files with.sh extention:${shnum}"
0
28.04.2021, 23:22

Так как это было отредактировано, я не могу сказать наверняка, но SOME_PATHдолжен был бы включать глобус без кавычек *для расширения до файлов в каталоге. Что-то вроде:

/path/to/*

Next [[ $file ==* ".txt"]]недействителен, в частности, ==*не является допустимым оператором сравнения. Вы можете использовать =~для сравнения регулярных выражений, например [[ $file =~.*\.txt ]], но лично я бы сначала извлек расширение и сравнил его по отдельности.

Далее shnum++недопустимо, вам нужно будет выполнить это внутри составной арифметической команды оболочки ((, например:((shnum++))

Наконец, вам не хватает закрывающего оператора doneдля цикла for.


Вот некоторый рабочий код, который сделает то, что вам нужно:

#!/bin/bash

txtnum=0
shnum=0

for file in /path/to/files/*; do
    ext="${file##*.}"
    if [[ $ext == txt ]]; then
        ((txtnum++))
    elif [[ $ext == sh ]]; then
        ((shnum++))
    fi
done

printf 'Number of.txt files: %d\n' "$txtnum"
printf 'Number of.sh files: %d\n' "$shnum"
2
28.04.2021, 23:22

Один из методов заключается в использовании find (1 )и подсчете количества находок wc (1 ).

Один из способов справиться с именами файлов, которые содержат проблемные символы (новой строки/пробела и т. д. ), состоит в том, чтобы найти вывод, например, номер узла i -.

#!/bin/bash

txtnum=0
shnum=0
directory=/tmp/somewhere


txtnum=$(/bin/find ${directory} -maxdepth 1 -name '*.txt' -type f -printf "%i\n"|/bin/wc -l)
shnum=$(/bin/find ${directory}  -maxdepth 1 -name '*.sh'  -type f -printf "%i\n"|/bin/wc -l)

echo "Number of.txt files: ${txtnum}"
echo "Number of.sh files: ${shnum}"
0
28.04.2021, 23:22

Не зацикливайте, если в этом нет необходимости. Не зацикливайтесь в оболочке, если только вы не работаете с файлами.

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

$ ls /usr/lib | awk -F '[/.]+' \
  '{ ext[$NF]++ } END { for(e in ext){ printf ".%-7s\t%4d\n", e, ext[e]} }' | 
grep -Ew 'so|0' # or extensions of your choice
.0                28
.so               10

Меньше печатать!

0
28.04.2021, 23:22

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

#!/bin/bash
declare -A exts

for path in "${SOME_PATH-.}"/*
do
    # Only files
    [[ -f "$path" ]] || continue

    # Split off the file component, and then its name and extension
    file=${path##*/}
    name=${file%.*} extn=${file##*.}
    # printf "%s -> %s -> %s %s\n" "$path" "$file" "$name" "$extn"

    # Count this extension type
    (( exts[$extn]++ ))
done

# Here is what we want to know
echo "txt=${exts[txt]-0}, sh=${exts[sh]-0}"
1
28.04.2021, 23:22

Теги

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