Как переименовать несколько файлов последовательно из командной строки?

Как переименовать файл, как показано ниже

AS1100801000002.RAW7AGS 
AS1100801001008.RAW7AH4
AS1100801002001.RAW7AH9
AS1100801003002.RAW7AHE
AS1100801004009.RAW7AHT
AS1100801005002.RAW7AHY
AS1100801010002.RAW7AJ3

на новое имя

AS1.txt
AS2.txt
AS3.txt
AS4.txt
AS5.txt
AS6.txt
AS7.txt
15
задан 30 May 2013 в 06:10

6 ответов

Чтобы улучшить ответ @ 116 Оли , в инструмент rename версии 1.600 Аристотеля Пагальциса встроен счетчик, $N. [ 1113]

Итак, все, что вам нужно, это

rename 's/AS.*/AS$N/' *

Для установки

  1. brew install rename или Скачать скрипт
  2. [ 1111] Сохраните его в каталоге по системному пути (обычно /usr/local/bin/brew или /usr/bin)
.
0
ответ дан 30 May 2013 в 06:10

Инструмент rename, который поставляется вместе с Ubuntu, очень хорош в подобных вещах. Вы можете встраивать маленькие выражения Perl, например, так:

rename -n 's/.+/our $i; sprintf("AS%d.txt", 1+$i++)/e' *

Это просто покажет вам, что он будет делать. Удалите -n, чтобы превратить его в упражнение с живым огнем.

Это в основном работает путем грубого определения переменной и увеличения ее на каждый файл, к которому мы обращаемся. Если у вас будет более 10 файлов, я предлагаю использовать заполнение нулями в sprintf. Следующее хорошо до 999:

rename -n 's/.+/our $i; sprintf("AS%03d.txt", 1+$i++)/e' *

... Но это достаточно легко расширить.

0
ответ дан 30 May 2013 в 06:10

Я не знаю ни одной команды или утилиты, которая бы это делала, но это достаточно просто сделать с помощью простого цикла:

N=1
for X in AS*RAW*; do
  mv $X AS$N.txt
  N=$(($N+1))
done
0
ответ дан 30 May 2013 в 06:10

rename позволяет Вам присвоиться непосредственно к $_, который идеален для этой проблемы.

Хотя аргументы кода мы передаем Perl rename утилита часто выполняет соответствие и замену (с s/), и полностью приемлемо решить эту проблему тот путь, нет действительно никакой потребности, для которой в случаях как, этот где Вы на самом деле не исследуете или снова используете текст старых имен файлов. rename позволяет Вам написать примерно любой код Perl, и он не должен быть встроен внутри s/ /e. Я предлагаю использовать команду как это:

rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' *

Или, если Вы испытываете желание сбривать несколько символов:

rename -n '$_ = sprintf "AS%02d.txt", ++our$i' *

(Это могло быть сделано еще короче, но не жертвуя ясностью.)

Обе тех команды делают то же самое. Каждый показывает, какое переименование операций было бы предпринято. После того как Вы испытываете один, и Вы довольны результатами, выполните его снова без -n опция. Как записано, это произвело бы имена файлов AS01.txt, AS02.txt, ..., AS10.txt, AS11.txt, и так далее. Можно изменить их по мере необходимости, затем только удалить -n когда Вам нравится то, что Вы видите.

Если Вы хотите заполнить к большей ширине, чем 2, замените 2 с большим количеством. Например, если по некоторым причинам Вы хотели имена файлов как AS00000000000001.txt, Вы заменили бы %02d с %014d. Если бы Вы не хотите дополнять вообще - даже при том, что это заставило бы Ваши файлы появиться в нечисловом порядке при списке их позже! - затем можно заменить %02d только с %d.

Как это работает? Ваша оболочка расширяется * в список файлов, прежде чем это даже будет работать rename команда. Список отсортирован лексикографически (т.е. в алфавитном порядке) согласно Вашим текущим настройкам локали. rename получает имена файлов как параметры командной строки и обрабатывает их в порядке, они перечислены. Выражение ++$i оценивает к одному большему, чем текущее значение переменной $i, и также устанавливает переменную $i к тому недавно увеличенному значению. Это значение передается sprintf, который форматирует его и помещает его в другом тексте. Этот текст присвоен непосредственно специальной переменной $_, который содержит имя файла. Начиная с rename файлы процессов в порядке, они передаются как аргументы, они пронумерованы соответственно.


Вы, возможно, заметили подобие ответу Oli!

Оба объявляют и увеличивают переменную счетчика и оба использования sprintf по существу тем же способом встроить значение того счетчика, дополненного слева нулями, в другом тексте новых имен файлов. (Информация в любом ответе о том, как заполнить нулями - и изменить дополнительную ширину - даже, применяется одинаково к обоим.) Причина, они так подобны, состоит в том, что метод, в котором более старый ответ действительно делает просто this1, но с дополнительными шагами, которые полезны для многих проблем, но не на самом деле необходимы для этого.

Для сравнения вот то, на что вторая команда в том ответе похожа, если изменено для использования стиля, который я использовал здесь (и заполнять к ширине 2, поскольку я сделал здесь, вместо 3):

rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' *

Часть между s/.+/ и /e в той команде теперь то же как выражение, к которому я присваиваюсь $_ (т.е. код правой стороны = оператор) в первой команде в этом ответе.

  • s/ оператор пытается соответствовать тексту (имена файлов, что Ваша оболочка, расширенная от * и передал как параметры командной строки, когда это работало rename) с регулярным выражением, и выполняет замену. / используется в качестве разделителя для разделения различных частей s выражение. Первая часть, .+, регулярное выражение; это соответствует любому символ (.), и делает так один или несколько раз (+). Так как имена файлов никогда не пусты - они - всегда по крайней мере один символ долго - это - один способ соответствовать любому имя файла.
  • Затем это производит текст из каждого соответствия - то есть, из каждого целого имени файла - состоящий из our $i; sprintf "AS%02d.txt", ++$i. Это производит новое имя файла. Как правило, каждый использует s/ произвести текст, который или (a) заменяет текст, который соответствовал просто части имени файла, или (b) на основе подобранный текст в некотором роде (например, он мог бы использовать специальную переменную как $& это расширяется до соответствия). В этом случае, тем не менее, подобранный текст не используется вообще.
  • Обычно текст, которым заменяют, our $i; sprintf "AS%02d.txt", ++$i использовался бы в качестве имени файла, не выполнялся бы как код. Но /e флаг в конце заставляет тот текст рассматриваться как исходный код Perl и оцениваться, и использует значение, произведенное путем выполнения так (в этом случае, возвращаемое значение встроенного Perl sprintf функция) как новое имя файла.

Хотя я думаю метод, я показал, вот более четкий и более простой подход для этой проблемы, чем какой-либо метод, который использует s/ с /e, хорошо знать о той технике, потому что это хорошо подходит для многих других проблем переименования файла, где все или часть исходных имен файлов исследованы и/или сохранены. Я рекомендую это сообщение в блоге Oli (кто также записал, что ответ), который включает некоторые такие примеры.

1 Технически, существует различие в поведении $_ = команды и s/ /e команды. В регулярном выражении .+, это не строго верно это . соответствия любой символ, потому что это не соответствует новой строке. Вы очень, вероятно, не должны использовать имена файлов с новыми строками в них, но Вы можете, и иногда файл называют тем путем случайно. Если Вы чувствуете себя подобно ему, контрастируете вывод rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' $'foo\nbar' к тому из rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' $'foo\nbar'. Сделать . соответствуйте новой строке, используйте s флаг, который идет в конце (с e). Таким образом, запишите /se в конце вместо /e.

2
ответ дан 30 May 2013 в 06:10

Предположим, что файлы, которые вы хотите переименовать, находятся в ~/Adir, и это единственные файлы в этой папке, затем:

n=0
for f in $( ls ~/Adir | sort ) ; do
    n=$(( n+1 ))
    mv -n "$f" "AS${n}.txt"
done

Этот скрипт будет смотреть на каждый файл в ~/Adir и переименовывать это до AS1.txt, AS2.txt, ..., если файл не существует (перезаписи не будет). Вот почему вы должны убедиться, что это единственные файлы в ~/Adir. Команда sort используется на тот случай, если вы хотите, чтобы файлы сохраняли первоначальный порядок.

0
ответ дан 30 May 2013 в 06:10

Хотя для OP требуется опция командной строки, она также доступна в качестве опции графического интерфейса в Nautilus и довольно проста.

Выберите все необходимые файлы и нажмите F2. Существует опция под названием «Автоматические номера». Вы можете добавить его к нужному тексту.

0
ответ дан 30 May 2013 в 06:10

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

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