2013-06-30 5 views
1

У меня есть множество файлов в папке. Я хочу сделать две вещи:bash переименовывать файлы с префиксом серийный номер

  1. префикс их ххх три цифры серийных номеров - по возрастанию: 001 002 и так далее
  2. удалить префикс из их названия, так 001a.xyz = a.xyz

Я намерен сделать это, используя простой скрипт bash. Какой самый элегантный и простой способ понять это?

редактировать

файлы находятся на съемном устройстве, и я не могу установить CHMOD + X на скрипте на устройстве. Итак, как мне запустить скрипт из моего домашнего каталога, который изменит файлы в другом каталоге?

+1

Это значит, что вы хотите, чтобы скрипты _two_, добавляющие префиксы, и другие, которые удаляют их? –

+0

Подождите, что? Вы хотите добавить префикс, а затем удалить префикс? И что, если у вас есть 001a.xyz, а также 002a.xyz - если префикс удален, он будет перезаписан. –

+0

«Элегантный и простой для понимания», как правило, это плохие вещи, на которых нужно сосредоточиться в bash - bash - это язык, полный ловушек; если вы хотите написать надежный код, сначала сосредоточитесь на _correct_; слишком легко придумать что-то интуитивно понятное, но склонное к тонким ошибкам. Если вы хотите, чтобы язык, где правильный код и элегантный код один и тот же, я предлагаю Python или хорошо продуманный LISP. –

ответ

4

Для добавления префиксов:

counter=1 
for f in *; do 
    printf -v prefix_str '%03d' "$((counter++))" 
    mv "$f" "${prefix_str}$f" 
done 

Чтобы удалить префиксы (осторожность - это может перезаписать, если у вас есть два файла с одинаковым индексом, но разные префиксы):

for f in [0-9][0-9][0-9]*; do 
    mv "$f" "${f:3}" 
done 

Используйте mv -n, чтобы избежать переписывание, когда два файла имеют одинаковый суффикс.

+0

Хорошее решение. Одна незначительная коррекция. ** Для добавления префикса ** решение не имеет счетчика приращений и начнется с 000. –

+0

, которое можно легко изменить, установив счетчик = 1 для стартового значения – kicker86

+0

@robmayhoff Спасибо за редактирование - что сказало, в этом случае, я думаю поместив приращение счетчика в математический контекст ('$ ((counter ++))') - это подход терминов. –

1

Это должно работать:

#!/bin/bash 

count=1 
for file in *; do 
    if [[ $file =~ [0-9][0-9][0-9].* ]]; then 
    sfile="${file:3}" 
    new=$(printf "%03d" ${count}) 
    mv "$file" "${new}${sfile}" 
    ((count++)) 
    else 
    new=$(printf "%03d" ${count}) 
    mv "$file" "${new}${file}" 
    ((count++)) 
    fi 
done 

Что делает этот сценарий является, проверяет наличие данного файла в текущем каталоге. Если файл имеет префикс, он удалит его и назначит новый последовательный префикс. Если в файле нет префикса, он добавит к нему последовательный префикс.

Конечный результат должен быть, все файлы в вашем текущем каталоге (некоторые с некоторыми и без префиксов) будут иметь новые последовательные префиксы.

Смежные вопросы