Изменить расширение файла при помощи скрипта оболочки - PullRequest
5 голосов
/ 06 марта 2012

Как изменить расширение всех файлов * .dat в каталоге на * .txt. Сценарий оболочки должен принимать имя каталога в качестве аргумента. Можно принять несколько каталогов в качестве аргументов. Распечатать журнал команд результат в режиме добавления с датой и отметкой времени.

Ответы [ 9 ]

19 голосов
/ 07 марта 2012

Пакетное переименование файлов по расширению в Unix

# change .htm files to .html
for file in *.htm ; do mv $file `echo $file | sed 's/\(.*\.\)htm/\1html/'` ; done

# change .html files to .htm
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1htm/'` ; done

#change .html files to .shtml
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1shtml/'` ; done

#change .html files to php
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1php/'` ; done

so ==>

# change .dat files to .txt
for file in *.dat ; do mv $file `echo $file | sed 's/\(.*\.\)dat /\1txt/'` ; done
11 голосов
/ 18 ноября 2016

Bash может выполнять всю тяжелую работу, такую ​​как извлечение расширения и пометка нового.Например:

for file in $1/*.dat ; do mv "$file" "${file%.*}.txt" ; done
8 голосов
/ 07 марта 2012
#!/bin/bash
for d in $*; do
    for f in $(ls $d/*.dat); do
        echo $(date) $(mv -v $f ${f%.dat}.txt)
    done
done

Перенаправление вывода должно выполняться оболочкой при запуске сценария

Оставляя проверки правильности аргумента

2 голосов
/ 19 мая 2012

Простой скрипт:

#!/bin/bash

if [ $# -lt 2 ] then
    echo "Usage `basename $0` <any number of directories space separated>"
    exit 85              # exit status for wrong number of arguments.
fi

for directories
do
    for files in $(ls $directories/*.dat); do
        echo $(date) $(mv -v $files ${files%.dat}.txt)
    done
done

Первый цикл for по умолчанию зацикливается на $@, т.е. переданы аргументы командной строки.

1 голос
/ 11 октября 2013

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

#remove the space in file name
#example file name:19-014-0100.mp3 .mp3
#result file name:19-014-0100.mp3
$ for file in *.mp3 ; 
    do target=`echo "$file" | sed 's/ //g'`;
    echo "$target"; 
    mv "$file" "$target"; 
done;

#remove the duplicate file extension in file name
#example file name:19-014-0100.mp3.mp3
#result file name:19-014-0100.mp3
$ for file in *.mp3 ; 
    do target=`echo "$file" | sed 's/\.mp3\.mp3$/.mp3/g'`;
    echo "$target"; 
    mv "$file" "$target"; 
done;
0 голосов
/ 23 января 2016

Чтобы переименовать (изменить расширение) все мои html-файлы в файлах epub, я использую эту командную строку:

find . -name "*.html*" -exec rename -v 's/\.html$/\.epub/i' {} \;
0 голосов
/ 07 января 2016

Следующая команда для изменения расширения файла .c на .h

find . -depth -name "*.c" -exec sh -c 'dname=$(dirname {}) && fname=$(basename {} .c) && mv {} $dname/$fname.h' ";"
0 голосов
/ 30 января 2015

Ответ, получивший наибольшее количество голосов, на самом деле не работал для меня. Возможно, я делал что-то не так. Мой сценарий пытался создать файл с исходным именем, но с добавленной к нему датой и изменением расширения с .xslx на .csv. Вот что у меня сработало:

csvname=`echo $xlsx |sed 's/\.xlsx//'`"-$now"`echo $xlsx | sed 's/\(.*\.\)xlsx/\.csv/'`

Итак, для всех файлов .dat в каталоге (без добавления даты) вы можете запустить что-то вроде этого:

for i in *.dat
do mv $i `echo $i |sed 's/\.dat//'``echo $i | sed 's/\(.*\.\)dat/\.txt/'`
done

Из приведенного выше, этот раздел кода только что удалил расширение:

echo $i |sed 's/\.dat//'

И этот раздел изменяет .dat на .txt:

echo $i | sed 's/\(.*\.\)dat/\.txt/'

И, накладывая их рядом друг с другом, он объединяет два вывода в имя файла. Это как делать это:

mv [filename][.dat] [filename] + [.txt]

Хотя я использовал STDOUT вместо команды 'mv'.

0 голосов
/ 21 декабря 2013

Скрипт, сначала находит имена заданных расширений.Удаляет расширение из имен.Затем добавляет обратную косую черту () для идентификации терминала.

Затем выполняется команда 'mv'.Здесь папка «.temp» используется для скрытия процесса от пользователя в графическом интерфейсе.

#!/bin/sh
if [ $# -ne 3 ] 
then
    echo "Usage:  ./script folder current_extension modify_extension"
    exit
fi
mkdir .temp
find $1 -name "*.$2" > .temp/output_1 && sed "s/$2//" .temp/output_1 > .temp/output_2 && sed -e "s/[ \t]/\\\ /g" .temp/output_2 > .temp/output_3
while read line
do
    mv -v "$line""$2" "$line""$3"
done < .temp/output_3
rm -rf .temp

Выходные файлы сохраняются в папке «.temp», затем папка «.temp» удаляется..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...