Как переименовать файл в bash
Перейти к содержимому

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

  • автор:

Форум русскоязычного сообщества Ubuntu

Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

  • Форум русскоязычного сообщества Ubuntu »
  • Ubuntu Russian LoCo »
  • Разработка (Модератор: Azure) »
  • Bash скрипт для пакетного переименования файлов

Страницы: [1] Вниз

Автор Тема: Bash скрипт для пакетного переименования файлов (Прочитано 1777 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Страницы: [1] Вверх

  • Форум русскоязычного сообщества Ubuntu »
  • Ubuntu Russian LoCo »
  • Разработка (Модератор: Azure) »
  • Bash скрипт для пакетного переименования файлов

Страница сгенерирована за 0.094 секунд. Запросов: 25.

  • Сайт
  • Об Ubuntu
  • Скачать Ubuntu
  • Семейство Ubuntu
  • Новости
  • Форум
  • Помощь
  • Правила
  • Документация
  • Пользовательская документация
  • Официальная документация
  • Семейство Ubuntu
  • Материалы для загрузки
  • Совместимость с оборудованием
  • RSS лента
  • Сообщество
  • Наши проекты
  • Местные сообщества
  • Перевод Ubuntu
  • Тестирование
  • RSS лента

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Копирование, перемещение, создание и удаление файлов и каталогов

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

Копирование файлов и каталогов

В Bash для копирования файлов используется команда cp (от «copy»), которой обычно передаются два аргумента:

  1. адрес с именем исходного файла,
  2. новый адрес с именем или просто адрес каталога, куда помещается копия.

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

cp readme readme2

В данном случае создается копия файла readme , которая остается в той же директории под именем readme2 .

cp readme Desktop/

В папку Desktop копируется файл readme . Здесь текущим является родительский Desktop’у каталог. Имена копии и файла оригинала будут совпадать, а вот полные адреса – нет.

cp /home/irina/tux.png /mnt/D/pingvin.png

Здесь копируется файл из одного каталога в другой, используются абсолютные адреса, имя копии изменяется.

Если надо скопировать несколько разных файлов в один и тот же каталог, то после команды cp сначала перечисляются все файлы-оригиналы, а последним указывается каталог, куда помещаются копии. Понятно, что при таком групповом действии имена файлов изменить не удастся.

Чтобы скопировать каталог со всем его содержимым, необходимо использовать ключ -r команды cp :

cp -r ./letters ./oldletters

Перемещение и переименование

В Bash-оболочке Linux для перемещения и переименования используется одна и та же команда – mv (от «move» – перемещать). Переименование можно рассматривать как частный случай перемещения, ведь по-сути изменяется полный адрес файла, что равносильно перемещению, даже если файл остается в том же каталоге.

Также как в случае cp , для mv необходимо указать пару аргументов. Выбор между перемещением и переименованием зависит от того, что это за аргументы. При перемещении файл меняет свой адрес, следовательно, если в первом и втором аргументах указаны разные адреса, то произойдет перемещение. Если адреса одинаковые, а различаются только имена, происходит переименование. Кроме того, перемещение может быть совмещено с переименованием.

В случае перемещения без переименования во втором аргументе указывается только каталог места назначения.

mv document.txt Work

mv document.txt Work/doc23.txt

Здесь в первом случае файл document.txt перемещается в каталог Work . Во-втором случае одновременно происходит перемещение файла и его переименование: document.txt перемещается в директорию Work и получает новое имя doc23.txt .

При использовании команды mv для переименования в качестве второго аргумента указывается новое имя:

mv order.txt orderNew.txt

mv Work/list.odt Work/names.odt

Каталоги перемещаются и переименовываются по тому же принципу, что и файлы (в отличие от cp ключ -r здесь не нужен).

Групповое перемещение файлов работает также, как с командой cp : сначала указываются перемещаемые объекты, в конце каталог назначения.

Создание файлов и каталогов

Новые директории создаются командой mkdir. Например, чтобы создать каталог Work в текущей директории необходимо выполнить следующую команду:

mkdir Work
или
mkdir ./Work

Существует множество способов создания файлов, обычно они создаются какой-либо программой. Если все же возникает необходимость создать пустой файл, сделать это можно с помощью программы touch . В качестве аргумента ей передается имя создаваемого файла. Еще один способ – перенаправление вывода какой-либо команды в файл. Пример:

Здесь программа cal выводит календарь на текущий месяц, а поскольку стоит знак перенаправления вывода, то вывод команды будет записан в файл January , находящийся в папке Work .

Удаление файлов и каталогов

Для удаления файлов используется команда rm. Например:

Командой rmdir можно удалить пустой каталог. Если же каталог не пуст, следует использовать команду rm с ключом -r :

Удаление непустого каталога: rm -r

Вопросы

У вас в каталоге есть файлы с разными расширениями. Вам надо группу файлов, имеющих одно и тоже расширение, скопировать в другой каталог. Как это сделать одной командой?

Какой ключ надо использовать, чтобы при перемещении случайно не перезаписать уже имеющийся в каталоге файл с таким именем?

Курс с ответами к заданиям и дополнительными уроками в PDF

X Скрыть Наверх

Введение в Linux и Bash. Курс

Переименование файлов с помощью find, sed и xargs

Данное сообщение не претендует на оригинальность, это просто очередной пример того, как можно переименовать много файлов с помощью командной строки в Linux, используя find , sed , xargs и mv .

Общий вид

  1. Вывести имена нужных файлов ( ls , echo или find ).
  2. Произвести замену каждого имени и вывести старое имя и новое имя ( sed ).
  3. Применить к каждой паре старое имя – новое имя команду mv ( xargs ).

На языке bash эти 3 команды могут выглядеть так:

user ~ $ user ~ $ user ~ $
ls | sed | xargs mv echo | sed | xargs mv find | sed | xargs mv

Мы будем говорить о последнем варианте, поскольку find является очень мощной и гибкой утилитой для поиска файлов.

Пример №1

Простейший случай, необходимо произвести такую замену с большим количеством файлов:

01-filename.txt → 01-new.txt 02-filename.txt → 02-new.txt . 

Для экспериментов создадим директорию ~/test/ .

user ~ $ user ~ $
mkdir ~/test/ cd ~/test/
user test $
touch -filename.txt

Теперь в директории ~/test/ должно появиться 5 пронумерованных файлов. Выведем эти файлы (точка после find означает, что поиск надо проводить в текущей директории; ключ -type f просит выводить только файлы).

find

user test $
find . -type f
./1-filename.txt ./2-filename.txt ./5-filename.txt ./4-filename.txt ./3-filename.txt 

Потоковый редактор sed в команде find | sed получает поток названий файлов от find. И с каждым названием файла он может делать какую-то операцию. Нас интересует замена, общий вид которой в sed выглядит так.

sed

Общий вид команд в редакторе sed:

sed 's/old/new/g' sed 's#old#new#g' sed 's:old:new:g' 

Если выполнить данные команды, то sed будет ждать ввода аргументов с клавиатуры. После каждого нажатия Enter sed выведет строку, заменив в ней ‘old’ на ‘new’, если ‘old’ будет присутствовать в введённой строке. Но обычно sed используется либо в связках типа find | sed , либо принимает в качестве аргумента имена файлов, чтобы произвести замены внутри файлов.

Заметьте, что вы сами можете выбирать разделитель — косая черта, диез (#) или двоеточие, комбинировать их нельзя. Буква ‘s’ — заменить (от англ. substitute); буква ‘g’ (от англ. global) в конце стоит для того, чтобы замена происходила во всей строке не только для первого вхождения, а столько раз, сколько там встретится «old». Когда в заменяемых выражениях встречаются косые черты («/» или «\»), то каждую из них приходится предварять дополнительным обратным слешем, тогда код слишком сильно напоминает частокол и удобнее использовать двоеточие в качестве разделителя.

Итак, посмотрим, что мы можем сделать двумя первыми шагами find | sed :

user test $
find . -type f | sed 's:filename:new:g'
./1-new.txt ./2-new.txt ./5-new.txt ./4-new.txt ./3-new.txt 

Отлично, нужные нам имена выведены. Но в третьем шаге утилите xargs нужны и старое, и новое имя файла, чтобы применить к ним команду mv . Поэтому модифицируем команду sed :

sed 'p;s:old:new:g' 

Знак «p;» (p — print), стоящий перед «s», просит sed выдавать не только результат, но и исходный материал. Теперь вывод будет такой:

user test $
find . -type f | sed 'p;s:filename:new:g'
./1-filename.txt ./1-new.txt ./2-filename.txt ./2-new.txt ./5-filename.txt ./5-new.txt ./4-filename.txt ./4-new.txt ./3-filename.txt ./3-new.txt 

То, что нужно. Переходим к третьему шагу.

xargs

Программа xargs работает с потоками данных. Утилита принимает один поток и может «распараллелить» его на несколько. Чтобы было лучше понятно, посмотрите простые примеры:

user ~ $
echo "1 2 3 4 5 6 7 8 9"
1 2 3 4 5 6 7 8 9 
user ~ $
echo "1 2 3 4 5 6 7 8 9" | xargs -n1
1 2 3 4 5 6 7 8 9 
user ~ $
echo "1 2 3 4 5 6 7 8 9" | xargs -n2
1 2 3 4 5 6 7 8 9 
user ~ $
echo "1 2 3 4 5 6 7 8 9" | xargs -n3
1 2 3 4 5 6 7 8 9 
user ~ $
echo "1 2 3 4 5 6 7 8 9" | xargs -n4
1 2 3 4 5 6 7 8 9 

Для переименования файлов, очевидно, нам нужен ключик -n2 , тогда xargs разделит поток из старых и новых имён в две колонки.

user test $
find . -type f | sed 'p;s:filename:new:' | xargs -n2
./1-filename.txt ./1-new.txt ./2-filename.txt ./2-new.txt ./5-filename.txt ./5-new.txt ./4-filename.txt ./4-new.txt ./3-filename.txt ./3-new.txt 

Отлично. Осталось перед каждой парой вставить mv , и переименование произойдёт. Выполняем:

user test $
find . -type f | sed 'p;s:filename:new:' | xargs -n2 mv

Вывода никакого не последует, но переименование произошло. Чтобы быть уверенным в результате, можно произвести проверку перед выполнением этой команды. Для этого надо добавить ключ -p к xargs . Тогда утилита будет показывать, что она сделала бы без ключа -p . Можно нажимать Enter и просматривать, что собирается сделать команда. Изменения применены не будут.

user test $
find . -type f | sed 'p;s:filename:new:' | xargs -n2 -p mv
mv ./1-filename.txt ./1-new.txt . 

Если результаты устраивают, то нужно убрать ключ -p и повторить команду.

добавить 180- в начале имени файла в текущей папке:
find * -maxdepth 0 -type f | sed ‘p;s:^:181-:g’ |xargs -n2 mv

только добавить расширение .txt к файлам в текущей папке:
find * -maxdepth 0 -type f | sed ‘p;s:$:\.txt:g’ | xargs -n2 mv

Пример №2

В директориях dir1/subdir1/ , dir1/subdir2/ ,… dir5/subdir5/ лежат файлы filename.txt. Нужно вытащить их оттуда, но уже с разными именами.

dir1/subdir1/filename.txt → dir1-subdir1-filename.txt dir1/subdir2/filename.txt → dir1-subdir2-filename.txt . dir5/subdir5/filename.txt → dir5-subdir5-filename.txt 

При необходимости создадим и очистим нашу экспериментальную директорию ~/test/ и создадим там необходимую структуру файлов:

user ~ $ user ~ $ user ~ $
mkdir -p ~/test/ rm ~/test/* cd ~/test/
user test $ user test $
mkdir -p dir/subdir touch dir/subdir/filename.txt

Итак, у нас получилось 25 файлов filename.txt в директориях dir1/subdir1/ , dir1/subdir2 ,… dir5/subdir5/ .

find

Выведем эти файлы. В этом случае -type f тоже сработал бы, но воспользуемся для разнообразия поиском по имени. Также используем звёздочку вместо точки, чтобы избавиться от ведущего ./ в выводе.

user test $
find * -name 'filename.txt'
dir1/subdir2/filename.txt dir1/subdir4/filename.txt dir1/subdir1/filename.txt dir1/subdir5/filename.txt dir1/subdir3/filename.txt . 

sed

Попросим sed заменить все слэши на дефисы.

user test $
find * -name 'filename.txt' | sed 'p;s:/:-:g'

xargs

user test $
find * -name 'filename.txt' | sed 'p;s:/:-:g' | xargs -n2 -p mv

Убедившись, что всё произойдёт правильно, убираем ключ -p и повторяем команду.

Пример №3

В директории лежат файлы, пронумерованные от 0 до 1001. Если их выводить командой ls , они будут отсортированы по имени не так, как этого хотелось бы [1] . Добавим необходимое количество нулей в названия файлов.

0-filename.txt → 0000-filename.txt . 50-filename.txt → 0050-filename.txt . 150-filename.txt → 0150-filename.txt . 1001-filename.txt → 1001-filename.txt 

При необходимости создаём тестовую директорию и/или чистим её и создаём наши 1001 файл:

user ~ $ user ~ $ user ~ $
mkdir -p ~/test/ rm -r ~/test/* cd ~/test/
user test $
touch -filename.txt

Можно действовать так (не лучший вариант).

user test $ user test $ user test $
ls | sed 'p;s:^\([0-9]\)-:000\1-:g' | xargs -n2 mv ls | sed 'p;s:^\([0-9][0-9]\)-:00\1-:g' | xargs -n2 mv ls | sed 'p;s:^\([0-9][0-9][0-9]\)-:0\1-:g' | xargs -n2 mv

Первая команда всем файлам, начинающимся с одной цифры, добавит 3 нуля. Вторая команда всем файлам, начинающимся с двух цифр, добавит 2 нуля. Третья команда всем файлам, начинающимся с трёх цифр, добавит 1 ноль.

Здесь использованы регулярные выражения в sed . Разберём конструкцию

^\([0-9][0-9][0-9]\)- 
  • ^ означает, что нужно искать с начала имени
  • конструкция \(. \) позволяет заключённое в неё использовать как \1 в шаблоне замены
  • [0-9][0-9][0-9] означает три любые цифры подряд.
  • — — просто дефис.
  1. В принципе, с этим можно справиться командой ls -v (natural sorting: 10 будет выведено после 9, а не после единицы), но мы всё-таки для упражнения произведём переименование. ↩

Как заменить пробелы в именах файлов символами подчеркивания в оболочке Linux

При работе с Linux вы можете столкнуться с некоторыми утилитами и приложениями, которые работают только с именами файлов, которые не содержат пробелов. Мы не всегда сохраняем файлы в этом формате «без пробелов» и, возможно, придется искать обходной путь, который заменяет пробелы в именах файлов символами подчеркивания «_». Таким образом, ваши имена файлов не будут содержать пробелов, и вы сможете легко работать с ними во всех приложениях. В этой статье мы объясним два способа преобразования всех пробелов в именах файлов в подчеркивания, очень просто через командную строку. Мы запустили команды и процедуры, упомянутые в этой статье, в системе Ubuntu 18.04 LTS. Папка «Мои загрузки», которую я буду использовать в качестве примера для этой статьи, содержит пробелы во всех именах файлов.

Метод 1: С помощью одной команды mv

В этом методе мы будем использовать команду Ubuntu mv в цикле for для переименования всех файлов / папок в данном каталоге, чтобы все пробелы в их именах заменялись символами подчеркивания. Откройте командную строку
Вот синтаксис команды, которую вы будете использовать:

$ for file in *; do mv «$file» `echo $file | tr ‘ ‘ ‘_’` ; done

Я выполнял то же самое Команда для замены пробелов на подчеркивания в моей папке загрузок: Когда я снова перечислил содержимое каталога, вы можете видеть, что все имена файлов теперь содержат подчеркивания вместо пробелов.

Метод 2: Использование сценария для переименования файлов

В этом методе мы будем использовать сценарий bash, который использует команду mv для переименования имен файлов и папок таким образом, что все пробелы заменяются подчеркиваниями. Откройте приложение Terminal и перейдите в папку bin следующим образом:

Теперь откройте новый файл сценария в одном из ваших любимых текстовых редакторов. Мы будем использовать редактор nano, чтобы открыть пустой файл сценария с именем replace_spaces.sh

$ sudo nano replace_spaces.sh

В этот пустой файл добавьте следующий сценарий:

#!/bin/bash
for f in *
do
new=»$»
if [ «$new» != «$f» ]
then
if [ -e «$new» ]
then
echo not renaming \»»$f»\» because \»»$new»\» already exists
else
echo moving «$f» to «$new»
mv «$f» «$new»
fi
fi
done

Совет: Вместо этого набрав весь скрипт в ваш bash-файл, вы можете скопировать его отсюда и вставить в терминал, используя Ctrl + Shift + V, или используя опцию Paste из контекстного меню. Необходимо сделать сделать этот файл исполняемым сценарием, запустите следующую команду в своем терминале:
$ sudo chmod +x replace_spaces.sh
Теперь вы готовы использовать сценарий в любой из ваших папок. Когда я запускаю сценарий в В моей папке «Загрузки» я вижу, что все пробелы в именах моих файлов преобразованы в подчеркивания следующим образом: Таким образом, это были два способа, которыми вы можете переименовывать файлы, чтобы все пробелы в их имена преобразуются в подчеркивания. Теперь любое приложение, которое вы используете, не сможет распознать имена файлов, содержащие пробелы.

Переименование файлов в Linux

mv rename linux

Переименование файлов в Linux можно выполнять средствами графических программ, а также через командную строку. Можно переименовать один файл, а можно сразу группу файлов — массовое переименование. Рассмотрим различные способы, с помощью которых можно переименовывать файлы в Linux.

Переименование командой mv

Команда mv (от слова move) используется для переименования или перемещения файлов и директорий из командной строки.

Синтаксис команды mv очень простой:

mv опции источник назначение

источник — файл(ы) или директория, которую необходимо переместить или переименовать.
назначение — файл или директория, в которую будет перемещен источник .

Основные опции:
-f — перезаписывать существующие файлы.
-n — не перезаписывать существующие файлы.
-i — выдавать запрос на перезапись существующих файлов.
-u — не перемещать файлы, которые уже существуют, если существующие файлы новее (время модификации новее).
-v — выводить имя каждого файла перед его переносом.

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

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

Переименование файла

Переименование файла myfile1.dat в файл myfile2.dat:

mv myfile1.dat myfile2.dat

Переименование файла с указанием пути до файла:

mv /home/pingvinus/myfile1.dat /home/pingvinus/myfile2.dat

Переименование директории

Переименование директории /home/pingvinus/mydir1 в директорию /home/pingvinus/mydir2 . Справедливо, если /home/pingvinus/mydir2 не существует.

mv /home/pingvinus/mydir1 /home/pingvinus/mydir2

Если /home/pingvinus/mydir2 существует, то, выполнив команду:

mv /home/pingvinus/mydir1 /home/pingvinus/mydir2

директория mydir1 будет перемещена внутрь директории /home/pingvinus/mydir2 . То есть mydir1 будет в результате находиться по адресу /home/pingvinus/mydir2/mydir1 .

Переименование и перемещение

Если в качестве файла назначения указан новый путь и новое имя файла, то файл будет перемещен и переименован. Например, следующая команда перемещает файл myfile1.dat в директорию /home/pingvinus/dir и переименовывает его в myfile2.dat :

mv /home/pingvinus/myfile1.dat /home/pingvinus/dir/myfile2.dat

Переименование командой rename

Команда rename служит для массового (пакетного) переименования файлов. Она позволяет выполнять замену определенных символов или частей имени файла и использованием Perl-регулярных выражений.

Если вдруг в вашем дистрибутиве нет команды rename , то ее можно установить, выполнив (выберите соответствующую команду для вашего дистрибутива):

sudo apt install rename sudo yum install prename yaourt -S perl-rename

Синтаксис команды rename :

rename опции ’s/ старое_имя / новое_имя ’ файлы

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

Основные опции:
-f — перезаписывать существующие файлы.
-n — вывести список файлов, которые будут переименованы и их новые имена, но не выполнять переименование.
-v — вывести список обработанных файлов.

Проще всего понять, как пользоваться данной командой, на примерах.

Изменение расширения файлов

Массово изменить расширение .html на .php у всех html-файлов.

rename 's/.html/.php/' *.html

По умолчанию rename не перезаписывает существующие файлы. Чтобы существующие файлы перезаписывались, используется опция -f :

rename -f 's/.html/.php/' *.html

Замена пробелов на подчеркивание

Заменить все символы пробелов в имени файлов на символ подчеркивания:

rename 'y/ /_/' *

Конвертация имен файлов в строчные буквы

rename 'y/A-Z/a-z/' *

Конвертация имен файлов в прописные буквы

rename 'y/a-z/A-Z/' *

Показать, что именно будет переименовано, но не переименовывать

Чтобы избежать ошибок при переименовании файлов, особенно при использовании сложных регулярных выражений, можно сначала вывести список того, что будет переименовано, но не запускать само переименование. Для этого служит опция -n .

Например, мы хотим изменить расширение у файлов с .jpeg на .jpg . Используем опцию -n , чтобы просто вывести какие файлы будут переименованы:

rename -n 's/\.jpeg$/.jpg/' *

Полное описание команд mv и rename можно получить, выполнив в терминале команды:

man mv man rename

Массовое переименование с использованием программ

Для массового переименования файлов можно воспользоваться программами:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *