#!/bin/bash
find . | while read OLD; do
NEW="`sed -E 's/(.*\/)?xxx-xxx_[a-zA-Z]+_[0-9]+_([0-9]+)\.jpg/\1\2.jpg/' <<< "$OLD"`"
[ "$OLD" != "$NEW" ] && mv "$OLD" "$NEW"
done
Некоторые примечания по этому вопросу:
Передача вывода find
в цикл while read
- это удобный способ считывания вывода find
по одной строке за раз. Это хорошо, потому что он будет обрабатывать файлы, так как find
находит их без необходимости сначала создавать полный список файлов, как это было бы, если бы вы сделали `find`
в обратных галочках.
Если у вас есть тонны несвязанных файлов, вы можете добавить опцию -regex
к find
согласно ответу soulmerge, но если нет, то нет необходимости.
Я изменил ваше регулярное выражение, чтобы разрешить имена каталогов в начале. Они будут захвачены в \1
, а число, которое вы ищете, будет \2
.
sed <<< "$OLD"
- это то же самое, что и echo "$OLD" | sed
, просто немного любитель ...
[ "$OLD" != "$NEW" ] && mv
- это то же самое, что и if [ "$OLD" != "$NEW" ]; then mv; fi
, просто немного любитель ...
Редактировать : изменено \d
на [0-9]
для совместимости. Я проверил его на своем Mac, и он работает. Вот что произошло в тестовом каталоге, который я настроил:
mv ./1/xxx-xxx_ERR_19_02.jpg ./1/02.jpg
mv ./2/xxx-xxx_BLAH_266_14.jpg ./2/14.jpg
mv ./xxx-xxx_ERR_19_01.jpg ./01.jpg