Фильтрация изображений согласно имени файла, почему?

Можно использовать whiptail или dialog

Имейте взгляд на этот поток:

Whiptail или диалоговое окно

Bash Shell Scripting/Whiptail

3
13.07.2014, 05:13
2 ответа
[

] Цикл [] для [], о котором вы говорили, вызывает у меня ошибку. Но он отлично работает, когда я использую экранирующий символ для квадратных скобок. Итак, мой цикл for был бы следующим:[

] [
find $1 -iname IMG_\\[0-9\\]\\[0-9\\]\\[0-9\\]\\[0-9\\].JPG -exec cp -b --suffix=.JPG  {} $2 \;
]
2
27.01.2020, 21:19
[

] Если я правильно прочитал, то ваша проблема заключается вот в чем:[

] [
find $1 -iname IMG_[0-9][0-9][0-9][0-9].JPG
] [

] Это никогда не находит файлы [].JPG.JPG[]. Послушайте:[

] [
mkdir JPG
for n in 9 8 7 6 5 4 3 2 1
    do touch ./JPG/IMG_000${n}.JPG
done
find ./JPG -iname IMG_[0-9][0-9][0-9][0-9].JPG

###OUTPUT###

./JPG/IMG_0001.JPG
./JPG/IMG_0002.JPG
./JPG/IMG_0003.JPG
./JPG/IMG_0004.JPG
./JPG/IMG_0005.JPG
./JPG/IMG_0006.JPG
./JPG/IMG_0007.JPG
./JPG/IMG_0008.JPG
./JPG/IMG_0009.JPG
] [

]Так что теперь я...[

] [
for f in ./JPG/* ; do touch ${f}.JPG ; done && ls ./JPG

IMG_0001.JPG      IMG_0003.JPG.JPG  IMG_0006.JPG      IMG_0008.JPG.JPG
IMG_0001.JPG.JPG  IMG_0004.JPG      IMG_0006.JPG.JPG  IMG_0009.JPG
IMG_0002.JPG      IMG_0004.JPG.JPG  IMG_0007.JPG      IMG_0009.JPG.JPG
IMG_0002.JPG.JPG  IMG_0005.JPG      IMG_0007.JPG.JPG
IMG_0003.JPG      IMG_0005.JPG.JPG  IMG_0008.JPG
] [

]Давайте посмотрим, что [] находит[] теперь показывает:[

] [
find ./JPG -iname IMG_[0-9][0-9][0-9][0-9].JPG

###OUTPUT###

./JPG/IMG_0001.JPG
./JPG/IMG_0002.JPG
./JPG/IMG_0003.JPG
./JPG/IMG_0004.JPG
./JPG/IMG_0005.JPG
./JPG/IMG_0006.JPG
./JPG/IMG_0007.JPG
./JPG/IMG_0008.JPG
./JPG/IMG_0009.JPG
] [

]Видите ли, потому что мои [].JPG.JPG[] имена файлов не заканчиваются на строку [][0-9]{4}.JPG[] []find[] никогда не показывает их в первую очередь. Добавление []\*[] в конец строки поиска []-имя[], возможно, подойдет Вам лучше. [

] [

] И все же, как упоминается в другом ответе, еще одна проблема - это ваши глобусы оболочки. Например:[

] [
sh -cx 'cd ./JPG ; find . -iname IMG_[0-9][0-9][0-9][0-9].JPG'                                                                      
+ cd ./JPG
+ find . -iname IMG_0001.JPG IMG_0002.JPG IMG_0003.JPG IMG_0004.JPG IMG_0005.JPG IMG_0006.JPG IMG_0007.JPG IMG_0008.JPG IMG_0009.JPG
find: paths must precede expression: IMG_0002.JPG
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
] [

]-видите? Если оболочка может, то она будет [][glob][] на тех квадратных скобках без кавычек, которые у вас есть еще до того, как вы передали командную строку в []find[]. Наверное, это должно выглядеть больше так:[

] [
find "$1" -iname 'IMG_[0-9][0-9][0-9][0-9].JPG*'
] [

]А что касается последнего бита, то рекурсивный цикл может и не потребоваться. Я думаю - раз уж вы ищете только старые []cp --suffix=.JPG -b[]ackups - это может сделать работоспособной замену всему из []shopt.... [] on:[

] [
(   dir=$2
    set -- "${dir}"/*[0-9].???
    while [ -e "$1" ]
    do  cmp "$1" "${1}.JPG" &&
        rm -v "${1}.JPG" 2>&1
    shift ; done
) 2>/dev/null
] [

] Хотя, признаюсь, это можно было бы оптимизировать с помощью одного [] типа [] рекурсивного цикла типа:[

] [
(   dir=$2
    set -- "${dir}"/*[0-9].???
    while [ -e "$1" ]
    do  until [ -e "${1}.JPG" ] 
        do shift || break; done
        cmp "$1" "${1}.JPG" &&
        rm -v "${1}.JPG" 2>&1
    ${1+shift} ; done
) 2>/dev/null 
] [

] Я говорю [] типа [], потому что оба цикла [] в то время как [] и [] до [] работают с одним и тем же набором параметров и даже никогда не тестируют один и тот же файл дважды, поэтому они не совсем [] повторяются [], даже если они вложены. В любом случае, оптимизация заключается в том, чтобы не выполнять []exec[]ни один другой процесс [] до тех пор, пока [] не станет необходимым и максимально полагаться только на сборки оболочки. [

]
2
27.01.2020, 21:19

Теги

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