Как я могу рекурсивно изменить xxx-xxx_[a-zA-Z]+_\d+_(\d+)\.jpg
на $1.jpg
?Есть ли скрипт grep или shell, который использует регулярное выражение для изменения имен файлов?
ответ
См. Различные ответы на этот вопрос: SuperUser.com. Он имеет дело с той же проблемой (переименование файлов с использованием регулярного выражения). [И мне потребовались годы, чтобы найти его на StackOverflow - потому что он был не на SO, а на SU! :(]
Я даю вам более подробную версию, которая может обрабатывать любое имя файла (даже те, которые находятся в папках с пробельных загрязненных имен):
# file rename.sh
old="$1"
new="$(dirname "$1")/$(echo "$(basename "$1")"|sed 's/^xxx-xxx_[a-zA-Z]+_[0-9]+_//')"
mv "$old" "$new"
# execute this in the shell:
find . -regex "xxx-xxx_[a-zA-Z]+_[0-9]+_[0-9]+\.jpg$" -exec ./rename.sh "{}" ";"
#!/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`
в backticks.Если у вас есть тонны несвязанных файлов, вы можете добавить опцию
-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
find /path -type f -name "???-???_[a-zA-Z]*_[0-9]*_*.???" | while read FILE
do
f=${FILE%%.???}
number=${f##*_}
extension=${FILE##*.}
path=${FILE%/*}
echo "mv '$FILE' '$path/$number.$extension"
done
Если у вас есть rename
(или prename
) команда (это скрипт на Perl, который иногда поставляется с Perl):
find -type d -name dir -exec rename 's/xxx-xxx_[a-zA-Z]+_\d+_(\d+)\.jpg/$1.jpg/' {}/xxx-xxx_[a-zA-Z]*[0-9].jpg \;
Что такое переименование? Я не понимаю, для чего это 's'? – steven
Не работал. – steven
's /.../.../' - команда Perl (и 'sed'). Он ищет регулярное выражение между первой и второй косой чертой и заменяет его тем, что находится между второй и третьей косой чертой. «$ 1» является обратной ссылкой на часть регулярного выражения, которое находится в круглых скобках ('sed' использует' \ 1'). –
- 1. Регулярное выражение для имен файлов В PHP
- 2. Регулярное выражение дано Grep
- 3. Регулярное выражение для отключения частей имен файлов?
- 4. Нужно регулярное выражение для допустимых имен файлов
- 5. Bash скрипт для изменения имен файлов рекурсивно
- 6. Grep многострочный регулярное выражение
- 7. Регулярное выражение, которое использует условное выражение «ИЛИ»
- 8. регулярное выражение в grep
- 9. Grep: Недопустимое регулярное выражение
- 10. Регулярное выражение Grep
- 11. Есть ли более чистое регулярное выражение для имен .so libs?
- 12. Grep линукс регулярное выражение
- 13. Содержимое файла как регулярное выражение для grep
- 14. Регулярное выражение с grep
- 15. Регулярное выражение для имен доменов
- 16. grep регулярное выражение 0 или много пробелов
- 17. Clojure Enlive: селектор, который использует регулярное выражение
- 18. Как использовать регулярное выражение в команде grep shell
- 19. Shell скрипт для обработки файлов
- 20. Shell скрипт для копирования файлов
- 21. Shell скрипт для переименования файлов
- 22. Регулярное выражение Grep команды для Linux
- 23. Регулярное выражение для файлов конфигурации unix
- 24. grep регулярное выражение для поиска последовательности чисел
- 25. Есть ли регулярное выражение для пустого ввода?
- 26. есть ли регулярное выражение для «год-год»?
- 27. Регулярное выражение для изменения строки
- 28. Использует гигантское ИЛИ регулярное выражение inefficent в python?
- 29. grep для нескольких имен файлов в каталоге
- 30. Grep не как регулярное выражение
Это совпадает с именем файла, такие как: ххх-xxx_ERR_19_01.jpg и возвращает 01 Что мне делать с этим кодом – steven
, и я не думаю, что это то, что мне нужно: у меня есть 1/ххх-xxx_ERR_19_01.jpg 2/ххх-xxx_ERR_19_01.jpg 3/ххх-xxx_ERR_19_01.jpg – steven
Ах, я забыл о поддиректорий в команде, исправит ... – soulmerge