2014-12-21 5 views
4

Скажем, у меня есть куча файлов с именем примерно так: bsdsa120226.nai bdeqa140223.nai, и я хочу переименовать их в 120226.nai 140223.nai. Как я могу достичь этого, используя сценарий ниже?bash script переименовать несколько файлов

#!/bin/bash 
name1=`ls *nai*` 
names=`ls *nai*| grep -Po '(?<=.{5}).+'` 
for i in $name1 
    do 
    for y in $names 
     do 
      mv $i $y 
     done 
    done 



Solution: 
name1=`ls *nai*` 

for i in $name1 
do 
y=$(echo "$i" | grep -Po '(?<=.{5}).+') 
mv $i $y 
done 
+0

попробовать это '(<=^. {5}).+ ' –

+1

@AQT, не имеет смысла вставлять _answer_ в ваш вопрос, это как бы разрывает целую концепцию Q & A. Просто примите ответ, который, по вашему мнению, прав. Если никто не был, и у вас есть ответ, _post_ это как ответ и принять его. – paxdiablo

ответ

1

Использование только Баш, вы можете сделать это:

for file in *nai* ; do 
    echo mv -- "$file" "${file:5}" 
done 

(Снимите echo, когда удовлетворены с выходом.)

Avoid ls in scripts, за исключением для отображения информации. Вместо этого используйте простой глобус.

См. Также How do I do string manipulations in bash? для получения более точных методов манипуляции.


Ваш скрипт не может работать с этой структурой: если у вас есть 5 файлов, он будет вызывать mv пять раз для первого файла (один раз для каждого элемента во втором списке), пять раз для второго, и т. д. Вам нужно будет перебирать два набора имен в lockstep. (Это также имеет дело не с вещами, как пробелы в именах файлов.)

+0

Работает ли команда rename на Centos/Redhat? – Dynamiite

+0

Есть команда переименования, но это не то, что было упомянуто в некоторых других ответах здесь (гораздо более ограничено, не поддерживает регулярные выражения). Возможно, вы можете установить его, но это просто скрипт perl. – Mat

0

Если ваша система имеет rename инструмент, то лучше идти с простой rename команды,

rename 's/^.{5}//' *.nai 

Это просто удалить первые 5 символов из имени файла.

ИЛИ

for i in *.nai; do mv "$i" $(grep -oP '(?<=^.{5}).+' <<< "$i"); done 
+0

Иногда в некоторых системах называется «prename» (Perl rename), в случае, если «rename» у вас, похоже, не работает. – paxdiablo

+0

Avinash, отсюда мой комментарий «на всякий случай» :-) – paxdiablo

+0

Хорошо спасибо какой-то идее, почему мой скрипт не работает? – Dynamiite

2

Это:

#!/bin/bash 

shopt -s extglob nullglob 
for file in *+([[:digit:]]).nai; do 
    echo mv -nv -- "$file" "${file##+([^[:digit:]])}" 
done 

Удалите echo, если вы счастливы с mv команд.

Примечание. Это решение не Предположим, что есть 5 ведущих символов для удаления. Он удалит все ведущие нечисловые символы.

1

Вы бы лучше использовать rename (prename на некоторых системах), так что позволяет использовать Perl регулярные выражения, чтобы сделать переименовывать, вдоль линий:

prename 's/^.{5}//' *.nai 

Причина ваш сценарий является не работает, что для каждый исходный файл, вы пытаетесь переименовать его в каждый целевой файл.

Если вам нужно ограничить себя с помощью этого скрипта, вы должны отработать одного целевого файла для каждый исходного файла, что-то вроде:?

#!/bin/bash 
for i in *.nai; do 
    y=$(echo "$i" | cut -c6-) 
    mv "$i" "$y" 
done 
Смежные вопросы