Сценарий оболочки, как перечислить имя файла в порядке возрастания - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в linux, пишу сценарий bash ниже. Файлы в текущей папке хранятся как 1.jpg, 2.jpg и т. Д., Я должен обрабатывать файлы последовательно в соответствии с их именами, но в следующем l oop я получаю имена файлов в другом порядке.

for i in ./*.jpg
do
filename=$(basename "$i")
echo "filename is  ./$filename"
done

вывод, который я получаю, выглядит следующим образом

filename is  ./10.jpg
filename is  ./11.jpg
filename is  ./12.jpg
filename is  ./13.jpg
filename is  ./14.jpg
filename is  ./15.jpg
filename is  ./16.jpg
filename is  ./17.jpg
filename is  ./18.jpg
filename is  ./19.jpg
filename is  ./1.jpg
filename is  ./20.jpg
filename is  ./21.jpg
filename is  ./22.jpg
filename is  ./27.jpg
filename is  ./28.jpg
filename is  ./29.jpg
filename is  ./2.jpg
filename is  ./3.jpg
filename is  ./4.jpg
filename is  ./6.jpg
filename is  ./7.jpg
filename is  ./8.jpg
filename is  ./9.jpg

Любая помощь относительно того, как я могу обработать их в последовательности имен 1.jpg, 2.jpg et c

Ответы [ 3 ]

1 голос
/ 03 августа 2020

Расширение пути (расширение glob) возвращает список имен файлов, отсортированный в алфавитном порядке в соответствии с вашим текущим языковым стандартом. Если у вас есть что-то простое, например UTF-8 или C, ваш порядок сортировки будет ASCII sorted . Это видно по результату ОП. Файл с именем 19.jpg сортируется до 1.jpg, потому что символ lt; точка> имеет более высокий лексикографический порядок, чем символ 9.

Если вы хотите просмотреть свои файлы в другой сортировке порядок, тогда необходимо использовать другой подход.

При смелом предположении, что OP запрашивает просмотр файлов в порядке c сортировки, то есть упорядочивает имена в соответствии с номером в начале имя файла, вы можете сделать следующее:

while IFS= read  -r -d '' file; do 
   echo "filename: $file"
done < <(find .  -maxdepth 1 -type f -name '*.jpg' -print0 | sort -z -n)

Здесь мы используем find для перечисления всех файлов в текущем каталоге (depth==1), мы печатаем их с \0 в качестве разделителя , и используйте sort, чтобы запросить запрошенную сортировку, указывая, что у нас есть \0 в качестве разделителя полей. Вместо использования for-l oop мы используем while-l oop для чтения информации.

См. BashPitFall001 Подробнее

примечание: sort -z является расширением GNU

0 голосов
/ 03 августа 2020

Из вашего требования к "обрабатывать их в последовательности имен 1.jpg, 2.jpg et c" , это выполнит sh то. Сортировка определяет числовой c ключ, полученный путем определения первого поля как строки перед "." разделитель.

#!/usr/bin/env bash

shopt -s nullglob
allfiles=(*.jpg);

for f in "${allfiles[@]}"
do
    echo "$f"
done | sort -t"." -k1n
0 голосов
/ 03 августа 2020

не совсем уверен, что вы спрашиваете, но у вас есть эхо внутри вашего l oop, которое заставит его каждый раз печатать в другой строке.

вы можете сделать:

list "" 
for i in ./*.jpg
do
filename=$(basename "$i")
list="$list $filename"
done    
echo  "files: $list"

, что выведет

files: 1.jpg 2.jpg

Тем не менее, Вы должны уточнить свой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...