2013-03-23 2 views
3

Я хотел бы написать сценарий linux, который будет перемещать или копировать все файлы с тем же именем (но разными расширениями) в новое имя файла для всех этих файлов при сохранении их разных расширений. Другими словами:Batch Переименование нескольких файлов с разными расширениями Linux Script?

, если я начну с листинг каталога:

file1.txt, file1.jpg, file1.doc, file12.txt, file12.jpg, file12.doc

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

file2.txt, file2.jpg and file2.doc, file12.txt, file12.jpg, file12.doc

Так файлы, имя файла не соответствующих критериям, не будут изменены.

С наилучшими пожеланиями,

Джордж

+0

'file1 *' + loop –

+0

Почему file2 соответствует file1, но не file12? Такая же длина имени заканчивается на одну цифру? – PeterMmm

ответ

4

Примечание: Если есть file1.doc в переменной i, выражение ${i##*.} извлекает расширение т.е. doc в этом случае. Решение


Одна линия:

for i in file1.*; do mv "$i" "file2.${i##*.}"; done 

Сценарий:

#!/bin/sh 
# first argument - basename of files to be moved 
# second arguments - basename of destination files 
if [ $# -ne 2 ]; then 
    echo "Two arguments required." 
    exit; 
fi 

for i in $1.*; do 
    if [ -e "$i" ]; then 
     mv "$i" "$2.${i##*.}" 
     echo "$i to $2.${i##*.}"; 
    fi 
done 
+0

Благодарим за предложение. К сожалению, имя файла1 неизвестно во время запуска скрипта. Я имею дело с сотнями папок, где будет 6 файлов, 3 из которых имеют одинаковое имя файла (список чисел и букв, которые являются переменными), но 3 разных расширения. В каждой папке будет всего 2 имени файла. ПРИМЕР: Folder1 содержит: filetextwords12.gif, filetextwords12.jpg, filetextwords12.txt, filextwordste23.gif, filextwordste23.jpg, filextwordste23.txt. Folder2 будет содержать аналогичную настройку (по 2 имени файла из 3 разных типов файлов). Благодаря! GH –

+0

Как программа должна знать, следует ли изменять файлы 'filetextwords12' или' filetextwordste23'? Должен ли 'filetextwordste23' также перемещаться так же, как' filetextwords12' должен быть? Если бы вы могли разработать немного больше, возможно, мы могли бы помочь вам ... – plesiv

0

Для обработки входных файлов, чьи basenames содержат специальные символы, я бы изменить сценарий plesiv на следующее:

if [ $# -ne 2 ]; then 
    echo "Two arguments required." 
    exit; 
fi 

for i in "$1".*; do 
    if [ -e "$i" ]; then 
     mv "$i" "$2.${i##*.}" 
     echo "$i to $2.${i##*.}"; 
    fi 
done 

Обратите внимание на дополнительные кавычки около $ 1.

2

Пакет util-linux-ng (в большинстве случаев он был установлен по умолчанию) имеет команду «переименовать». См. man rename для использования. Используя его, ваша задача может быть выполнена просто так:

rename file1 file2 file1.*