LINUX.ORG.RU
ФорумAdmin

переименовать файлы?


0

1

ситуация:

1.пара сотен файлов в различных подпапках: AVSEQ01.DAT, AVSEQ02.DAT, ... и т.д.

2.рядом текстовые файлы AVSEQ01.DAT.son, AVSEQ02.DAT.son, ... и т.д.

3.содержимое файлов *.DAT.son:

file AVSEQ0[0-2].DAT.son

AVSEQ01.DAT.son: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators

AVSEQ02.DAT.son: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators

cat AVSEQ01.DAT.son

��

[]

index=10601

title=Sch�ner fremder Mann (org. Pioneer)

chars=35

singer=Francis, Connie

language=Deutsch

style=Schlager

grade=0

channel=

order_time=0

region=

library=E:\VCD Olli

media_file=\106\AVSEQ01.DAT

remark=VCD

lupd_by=

lupd_time=

Вопрос: как, взяв «правильное» имя из строки начинающейся словом title=,
переименовать файлы *.DAT и *.DAT.son присвоив это имя, но оставив суффикс?

Заранее благодарен всем!

PS:
для конвертации и извлечения имени пока что ничего не приходит в голову кроме:
iconv -f utf-16 -t utf-8 AVSEQ01.DAT.son | grep title | sed 's/.$//'



Последнее исправление: Aff (всего исправлений: 1)

#!/bin/env tclsh
proc renameFile { fileName title } {
  if { ! [ file isfile $fileName ] || ! [ file readable $fileName ] } {
  return
 }
  set fileDir [ file dirname $fileName ]
  set fileExt [ file extension $fileName ]
  set title [ string map [ list [ file separator ] "_" ] $title ]
  set newName [ file join $fileDir $title.$fileExt ]
  file rename $fileName $newName
}
if { $argv == {} } {
  puts "sample usage : $argv0 *.son"
  exit 0
}
foreach fileName $argv {
  set fd [ open $fileName "r" ]
  fconfigure $fd -encoding unicode
  set data(title) {}
  set data(media_file) {}
  while { ! [ eof $fd ] } {
     set fd [ gets $f ]
     if [ regexp {(title|media_file)=(.*)$} -> keyName keyVal ] {
        set data($keyName) [ string trim $keyVal ]
        if { $data(title)!={} && $data(media_file)!={} } {
           renameFile $data($media_file) $data($title)
           break
        }
     }
  }
  close $fd
}
MKuznetsov ★★★★★
()
RENAME(1)                                   Linux Programmer's Manual                                   RENAME(1)

NAME
       rename - Rename files

SYNOPSIS
       rename from to file...
       rename -V

DESCRIPTION
       rename will rename the specified files by replacing the first occurrence of from in their name by to.

       -V, --version
              Display version information and exit.

       For example, given the files
              foo1, ..., foo9, foo10, ..., foo278, the commands

              rename foo foo0 foo?
              rename foo foo0 foo??

       will turn them into foo001, ..., foo009, foo010, ..., foo278.

       And
              rename .htm .html *.htm

       will fix the extension of your html files.

SEE ALSO
       mmv(1), mv(1)

NOTE: там может быть две rename или не та rename. Изучайте документацию к своей ОС.

drBatty ★★
()

что-то не распарсил сразу. исправляюсь:

$ rent.sh AVSEQ0\[0-2\].DAT.son 
rename 'AVSEQ0[0-2].DAT.son' -> 'Sch�ner fremder Mann (org. Pioneer)AVSEQ0[0-2].DAT.son'
$ cat rent.sh 
#!/bin/sh

for NAME in $@
do
	TRUE_NAME=`sed -n '/^title=/s///p' $NAME`
	EXT=${NAME%%*.}
	echo "rename '$NAME' -> '$TRUE_NAME$EXT'"
done
drBatty ★★
()
Ответ на: комментарий от arsi

title=`iconv...

Спасибо Вам и всем откликнувшимся!

grep -oP '(?<=title=).*' - не удаляются Windows CR LFиды,
то бишь это «безобразие» попадает в имена файлов.
на текущий момент нахожу интересным:
title=«$(iconv -f utf-16 -t utf-8 »$i.son" | sed -n 's/\r//; s/^title=//p')"

Aff
() автор топика
Ответ на: title=`iconv... от Aff

> grep -oP '(?<=title=).*' - не удаляются Windows CR LFиды

grep -oP '(?<=^title=)[^\r]*'
arsi ★★★★★
()

Привожу несовершенный, но работающий вариант, может ещё кому згодится.
cat ren_mult:

#!/bin/bash
# 1)ищем файлы(find), 2)вызываем (-exec) ren_mult,
# 3) сортируем (sort) будущую таблицу в алфавитном порядке.
# find /tmp/1 -name "AVSE*.DAT" -exec bash -c "ren_mult {}" \;; sort -o /tmp/namen_list.csv /tmp/list.txt && rm -f /tmp/list.txt

ALT_NAME="$1"
PUT="${ALT_NAME%/*}"
NAZVANIE="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^title=//p')"
# убрать запятую из имён певцов s/,//;
SINGER="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/,//; s/^singer=//p')"
JAZYK="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^language=//p')"
STYLE="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^style=//p')"
LIBRARY="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^library=//p')"
MEDIA_FILE="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^media_file=//p')"

NEW_NAME="$PUT/$NAZVANIE.DAT"
SINGER_NAME="$PUT/$SINGER.DAT"

if [ -n "$NAZVANIE" ]; then
mv "$1" "$NEW_NAME"
mv "$1.son" "$NEW_NAME.son"
# если строка ^title= пустая, использовать имя исполнителя в качестве имени файла
elif [ -n "$SINGER" ]; then
mv --backup=numbered "$1" "$SINGER_NAME"
mv --backup=numbered "$1.son" "$SINGER_NAME.son"
fi

# в заключение изготавливаем сортированный (см. строку 3) csv файл для импорта в чего-нибудь табличное:

for in
do
echo -e "\"${NAZVANIE:-Неизвестно}\";\"${SINGER:-Неизвестно}\";\"${STYLE:-Неизвестно}\";\"${JAZYK:-Неизвестно}\";\"${LIBRARY:-Неизвестно}${MEDIA_FILE:-Неизвестно}\";" >>/tmp/list.txt
done

Aff
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.