Я пытаюсь обрезать имена файлов до последних 4 цифр (пример: 941_S_5193, чтобы стать 5193). Какой самый простой способ зациклить эту команду для применения примерно к 600 файлам?
Спасибо. -Km
Команда 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
для фактического переименования, чтобы иметь место
Я бы предложил цикл по элементам в каталоге, используя ls | tail -c 5
, чтобы перечислить последние 4 цифры каждого файла.
Вы дали 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
Шаги, чтобы полностью оценить команду:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*'
, чтобы найти файлы, которые будут изменены, (1)
не выполняются, тогда regex
не соответствует именам файлов, откорректируйте регулярное выражение и обновите ваш вопрос, иначе Когда это произойдет, как ожидается, добавьте часть -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
к команде в шаге (1), так что находит и показывает то, что переименовывается.
blockquote>
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
По завершении удалите опцию -n
, чтобы фактически переименовать эти файлы. Вот так:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;