Форум русскоязычного сообщества 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»), которой обычно передаются два аргумента:
- адрес с именем исходного файла,
- новый адрес с именем или просто адрес каталога, куда помещается копия.
Адрес может быть как абсолютным, так относительным. Если операции с файлами выполняются в текущем каталоге, то указывать адрес смысла нет. Пишется только имя исходного файла и имя копии. Поскольку файлов с одинаковыми именами и адресами быть не может, имя копии должно отличаться от имени исходного файла.
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 :

Вопросы
У вас в каталоге есть файлы с разными расширениями. Вам надо группу файлов, имеющих одно и тоже расширение, скопировать в другой каталог. Как это сделать одной командой?
Какой ключ надо использовать, чтобы при перемещении случайно не перезаписать уже имеющийся в каталоге файл с таким именем?
Курс с ответами к заданиям и дополнительными уроками в PDF
X Скрыть Наверх
Введение в Linux и Bash. Курс
Переименование файлов с помощью find, sed и xargs
Данное сообщение не претендует на оригинальность, это просто очередной пример того, как можно переименовать много файлов с помощью командной строки в Linux, используя find , sed , xargs и mv .
Общий вид
- Вывести имена нужных файлов ( ls , echo или find ).
- Произвести замену каждого имени и вывести старое имя и новое имя ( sed ).
- Применить к каждой паре старое имя – новое имя команду 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] означает три любые цифры подряд.
- — — просто дефис.
- В принципе, с этим можно справиться командой 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

Переименование файлов в 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
Массовое переименование с использованием программ
Для массового переименования файлов можно воспользоваться программами: