Если у вас есть команда rename
в вашей UNIX, вы сможете использовать что-то вроде:
mkdir images_renamed
cd images_renamed
cp ../103*.jpg .
rename 103 201003 *.jpg
rename FROM TO FILE
переименует все файлы, указанные в FILE
, изменив первое вхождение FROM
на TO
.
Если это не доступно, вы можете использовать что-то вроде:
mkdir images_renamed
for fspec in 103*.jpg ; do
cp ${fspec} images_renamed/201003${fspec:3}
done
Чтобы сделать это рекурсивно, я бы поместил это в скрипт с find
:
#!/usr/bin/bash
rm -rf images_renamed
ls -lR images
echo
cd images
find . -name '*.jpg' | while read -r; do
mkdir -p "../images_renamed/$(dirname "$REPLY")"
echo 'Copying from' [$REPLY]
echo ' to' [../images_renamed/$REPLY] and renaming.
echo
cp "$REPLY" "../images_renamed/$REPLY"
cd "$(dirname "../images_renamed/$REPLY")"
rename 103 201003 "$(basename "$REPLY")"
cd - >/dev/null
done
cd ..
ls -lR images_renamed
Требуется только средний бит, остальное для тестирования. Вывод ниже показывает, как это работает, копируя каждый файл в новую структуру каталогов и переименовывая соответствующие файлы.
images:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir1
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir2
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:56 dir3
images/dir1:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 102xxx.jpg
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 103xxx.jpg
images/dir2:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 103yyy.jpg
images/dir3:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir 4
images/dir3/dir 4:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 103zzz.jpg
Copying from [./dir1/102xxx.jpg]
to [../images_renamed/./dir1/102xxx.jpg] and renaming.
Copying from [./dir1/103xxx.jpg]
to [../images_renamed/./dir1/103xxx.jpg] and renaming.
Copying from [./dir2/103yyy.jpg]
to [../images_renamed/./dir2/103yyy.jpg] and renaming.
Copying from [./dir3/dir 4/103zzz.jpg]
to [../images_renamed/./dir3/dir 4/103zzz.jpg] and renaming.
images_renamed:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir1
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir2
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir3
images_renamed/dir1:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 102xxx.jpg
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003xxx.jpg
images_renamed/dir2:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003yyy.jpg
images_renamed/dir3:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir 4
images_renamed/dir3/dir 4:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003zzz.jpg
Чтобы выровнять файловую иерархию, вы можете использовать что-то вроде:
#!/usr/bin/bash
rm -rf images_renamed
ls -lR images
echo
cd images
mkdir -p ../images_renamed
find . -name '*.jpg' | while read -r; do
newfile="$(basename "$REPLY")"
echo 'Copying from' [$REPLY]
echo ' to' [../images_renamed/$newfile] and renaming.
echo
cp "$REPLY" "../images_renamed/$newfile"
cd ../images_renamed
rename 103 201003 "$newfile"
cd - >/dev/null
done
который выводит:
cd ..
ls -lR images_renamed
images:
total 0
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir1
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir2
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:56 dir3
images/dir1:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 102xxx.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 103xxx.jpg
images/dir2:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 103yyy.jpg
images/dir3:
total 0
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir 4
images/dir3/dir 4:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 103zzz.jpg
Copying from [./dir1/102xxx.jpg]
to [../images_renamed/102xxx.jpg] and renaming.
Copying from [./dir1/103xxx.jpg]
to [../images_renamed/103xxx.jpg] and renaming.
Copying from [./dir2/103yyy.jpg]
to [../images_renamed/103yyy.jpg] and renaming.
Copying from [./dir3/dir 4/103zzz.jpg]
to [../images_renamed/103zzz.jpg] and renaming.
images_renamed:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 102xxx.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003xxx.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003yyy.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003zzz.jpg
но вы должны иметь в виду, что конфликты имен файлов (одно и то же имя файла в разных каталогах) будут перезаписывать друг друга.