Выберите последний файл, основанный на порядковом номере, данном в имени файла

Я полагаю, что это - известная проблема с N 1 000 карт. Я имею один в моем ноутбуке, который был заполонен этой проблемой со дня один. То, что мы закончили тем, что делали, отключало сторону N этой карты, так как это - то, где проблема была изолирована один и другие.

Это сообщение в блоге экстенсивно охватило проблему, названную:

Можно отключить беспроводную связь N функциональность временно как так:

$ modprobe iwlagn 11n_disable=1

Сделать это постоянным:

# /etc/modprobe.d/wireless.conf
options iwlagn 11n_disable=1

затем разгрузите и перезагрузите драйвер:

# unload
$ rmmod iwlagn

# load
$ modprobe iwlagn

Последний Intel Drivers

Можно попытаться загрузить и установить последние драйверы Центрино для карт N-1000 отсюда, Беспроводные сети + Intel® Wi-Fi Products + Intel® Centrino® Wireless.

3
29.09.2016, 14:20
5 ответов
#!/bin/bash

ls /tmp/*dat > filelist

while read fn
do 
    #do something with /tmp/$fn
done < filelist
1
27.01.2020, 21:14

в предположении, что

  • все файлы не начинаются с образца
  • числовое поле раздувается на _
  • вы не можете передать время файла

я бы использовал

sort -t_ -k2n

, которое дает четыре файла, приведенных в примере

Sample_0000137294-003_xyz.dat
Sample_0000237826-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000437564-001_xyz.dat
1
27.01.2020, 21:14

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

find . -name '*dat' | sort -r | tail -n1

Если вам нужно разобраться со странными символами, используйте

find . -name '*dat' -print0 | sort -zr | tr '\0' '\n' | tail -n1

Таким образом, вы можете сделать что-то типа

file=$(find . -name '*dat' -print0 | sort -zr | tr '\0' '\n' | tail -n1)
while [ -e "$file" ]; do
    if [ -e "$file" ]; then 
        echo "$file"; ## Process the file here
        rm "$file"; 
    fi;
file=$(find . -name '*dat' -print0 | sort -zr | tr '\0' '\n' | tail -n1)
done

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

find . -name '*dat' -print0 | sort -zr -t "_" -k 2 | tr '\0' '\n' | tail -n1

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

for file in *dat; do
   echo "$file" ## process the file here
   rm "$file"
done
1
27.01.2020, 21:14

Эта команда даст имя файла только одного файла, отсортированного по числовым полям, предполагая, что шаблон - это Sample_nnnnnn-ppp_xyz. dat:

ls Sample_$(ls -l *.dat | awk -F ' |_' {'print $10'} |sort -n| head -1)*.dat
0
27.01.2020, 21:14

С помощью zsh:

extract_numbers() REPLY=${(SM)REPLY##<->-<->}
for file (*<->-<->*.dat(no+extract_numbers)) {
  do-what-you-will-with $file
}

Мы определяем функцию сортировки (extract_numbers), которая возвращает Substring имени файла, который Matches <->-<-> (<-> соответствует любому положительному знаку после запятой).

Мы используем эту функцию для numeric ordering глобуса *<->.<->*.dat.

3
27.01.2020, 21:14

Теги

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