Усечение имен файлов

Я пытаюсь обрезать имена файлов до последних 4 цифр (пример: 941_S_5193, чтобы стать 5193). Какой самый простой способ зациклить эту команду для применения примерно к 600 файлам?

Спасибо. -Km

1
задан 27 June 2018 в 19:06

3 ответа

Команда rename может сделать это достаточно хорошо:

# Note, -n flag used for testing only, remove for actual renaming
$ ls
941_P_5191  941_P_5192  941_P_5193  941_P_5194
$ rename -n 's/^(.*)_([0-9]{4})$/$2/'  ./*
./941_P_5191 renamed as 5191
./941_P_5192 renamed as 5192
./941_P_5193 renamed as 5193
./941_P_5194 renamed as 5194

Вы также можете выполнить удаление префиксов в bash и mv в цикле for:

$ for f in ./*; do echo mv "$f" "${f##*_}"; done
mv ./941_P_5191 5191
mv ./941_P_5192 5192
mv ./941_P_5193 5193
mv ./941_P_5194 5194

Примечание: удалить echo для фактического переименования, чтобы иметь место

3
ответ дан 27 June 2018 в 19:06

Я бы предложил цикл по элементам в каталоге, используя ls | tail -c 5, чтобы перечислить последние 4 цифры каждого файла.

0
ответ дан 27 June 2018 в 19:06

Вы дали 941_S_5193 в качестве одного имени файла, но еще немного было бы полезно. Я вызвал эту команду find, которая сделала это с файлом-образцом с именем 941_S_5193:

find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;

Имена файлов-примеров:

941_S_5194
923_D_5234
941_S_5193
941_S_5134
941_A_0034
941_C_9034

С помощью этой команды:

[ 112]

Производит эти изменения в именах файлов:

rename(./941_S_5194, ./5194)
rename(./923_D_5234, ./5234)
rename(./941_S_5193, ./5193)
rename(./941_S_5134, ./5134)
rename(./941_A_0034, ./0034)
rename(./941_C_9034, ./9034)

Результаты:

0034
5134
5193
5194
5234
9034

Примечание: Использование опции '-n' в команде переименования позволяет увидеть, что переименовывается раньше исходя из фактического переименования. Удалите эту опцию, когда вы будете готовы переименовать эти файлы.

Шаги, чтобы полностью оценить команду:

  1. Сначала используйте это find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*', чтобы найти файлы, которые будут изменены,
  2. Если шаги (1) не выполняются, тогда regex не соответствует именам файлов, откорректируйте регулярное выражение и обновите ваш вопрос, иначе
  3. Когда это произойдет, как ожидается, добавьте часть -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \; к команде в шаге (1), так что находит и показывает то, что переименовывается.

    find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;

  4. По завершении удалите опцию -n, чтобы фактически переименовать эти файлы. Вот так:

    • find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
0
ответ дан 27 June 2018 в 19:06

Другие вопросы по тегам:

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