Intereting Posts
Откройте окно командной строки в GNOME Desktop Как Linux запрещает приложениям отправлять больше пакетов, чем может обрабатывать ссылка, не отбрасывая пакеты? Что вызывает скрипт csh иногда не source /etc/csh.cshrc? ошибка libvirt-bin на виртуальной машине при попытке указать VM Миграция с аппаратного обеспечения на программный RAID Ошибка: неправильная архитектура 'amd64' & Не удается найти пакет libc6-dev-i386 Автоматическое подключение сетевого накопителя при необходимости и размонтировать его через некоторое время бездействия Нет загрузочного меню с Linux Mint и Windows 7 Как вырезать текстовый файл с помощью Vim Как создать вопрос подтверждения в Linux? pv (индикатор выполнения) и gzip Показывать IP-адреса последних 20 пользователей для входа на мой сервер Пост-скрипт не запускается после установки Есть ли способ определить, какой процесс превращается в процесс зомби Создание символических ссылок на файлы с использованием подстановочных знаков

Измените только расширение файла

Я работаю над простым сценарием оболочки, чтобы изменить файл one.PDF на one.pdf . У меня есть этот файл, который хранится в папке Task1.

Мой скрипт находится в том же каталоге, что и Task1. Вызывается Shell1.sh Когда я запускаю его Task1 становится Task1.pdf, но файл внутри one.PDF не изменяется. Мне нужно это наоборот, но ничего, что я пытаюсь, кажется, работает. Я продолжаю чередовать синтаксическую ошибку, mv не может двигаться, потому что ресурс занят или просто переименовывает каталог.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

 #!/bin/bash #shebang for bourne shell execution echo "Hello this is task 1" #Initial prompt used for testing to see if script ran #/rename .* .pdf *.pdf // doesnt work #loop to iterate through each file in current directory and rename for file in Task1; do mv "$file" "${file%.PDF}.pdf" done 

Используйте globbing для получения имен файлов:

 for file in Task1/*; do mv ...; done 

Для точности используйте только файлы, заканчивающиеся на .PDF :

 for file in Task1/*.PDF; do mv ...; done 

Точнее, убедитесь, что мы имеем дело с файлами, а не с каталогами:

 for file in Task1/*.PDF; do [ -f "$file" ] && mv ...; done 

В качестве дополнительной заметки ваш шаблон расширения параметров прекрасен.

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

 rename 's/PDF/pdf/' Task1/* 

Вот хорошая статья об этом: Rename – инструмент командной строки для переименования нескольких файлов в Linux .

Если rename вашего дистрибутива является командой C из util-linux (например, Arch Linux):

rename PDF pdf Task1/*PDF

Это будет работать, если ваши файлы PDF не содержат строку «PDF» где-то, кроме конца, например example_PDF_file.PDF .