Вот один из способов:
for f in *.txt; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
Между do
и done
, он смотрит на один файл в то время, и имя текущего файла находится в f
параметра Я. "$f"
- значение этого параметра, неизмененное. "${f/[0-9][0-9][0-9].txt/.txt}"
- значение параметра с применяемой заменой: замените «три цифры, а затем .txt
» всего .txt
.
Как отметил @anubhava, если вы запустите его более одного раза, он будет удерживать цифры от имен файлов, поэтому не делайте этого. Вы можете сделать это идемпотентным, ужесточив шаблон шара. Это немного громоздкий:
for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
Таким образом, вы можете использовать внешний инструмент, чтобы сделать его более компактным (это предполагает, что нет пробелов или символов новой строки в любых именах файлов в каталоге):
for f in $(ls -1 | egrep '^[0-9]{13}\.txt$'); do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
Вы можете уменьшить ограничение на просто «никаких новых строк» с помощью while read
цикла:
ls -1 | egrep '^[0-9]{13}\.txt$' | while read f; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
A отказоустойчивая альтернатива python, которая работает рекурсивно: http://stackoverflow.com/a/39698169/191246 – ccpizza