] Цикл [] для [
], о котором вы говорили, вызывает у меня ошибку. Но он отлично работает, когда я использую экранирующий символ для квадратных скобок. Итак, мой цикл for был бы следующим:[
find $1 -iname IMG_\\[0-9\\]\\[0-9\\]\\[0-9\\]\\[0-9\\].JPG -exec cp -b --suffix=.JPG {} $2 \;
] ] Если я правильно прочитал, то ваша проблема заключается вот в чем:[
] [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[
]ни один другой процесс [] до тех пор, пока [
] не станет необходимым и максимально полагаться только на сборки оболочки. [