Переименование файлов с помощью sed и mv
Я хочу переименовать файлы в формате:
img_MM-DD-YY_XX.jpg
img_MM-DD-YY_XXX.jpg
в:
newyears_YYYY-MM-DD_XXX.jpg
где:
- гггг = год
- mm = месяц
- DD = день
- XXX или XX = номер фотографии
Я придумал этот скрипт, но это не работа:
for filename in ?*.jpg; do
newFilename=$(echo $filename |
sed 's/img_(.*)-(.*)-(.*)_([0-9][0-9])./newyears_20--_0./;
s/img_(.*)-(.*)-(.*)_([0-9][0-9][0-9])/newyears_20--_/' -)
mv $filename $newFilename
done
любая помощь была бы весьма признательна.
7 ответов
вы можете попробовать этот скрипт в bash:
for filename in *.jpg; do
newFilename=$(sed -E 's#img_([0-9]{1,2})-([0-9]{1,2})-([0-9]{1,2})_(.*)$#newyears_20--_#' <<< "$filename")
mv "$filename" "$newFilename"
done
sed -E
поддерживает gnu sed
также.
без цикла for.
ls | grep 'jpg$' | sed '
#Save the original filename
h
#Do the replacement
s/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9]\)\./newyears_20--_0.//
s/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9][0-9]\)/newyears_20--_//
#Bring the original filename back
x
G
s/^\(.*\)\n\(.*\)$/mv "" ""' | bash
ommit трубопроводов Баш, чтобы увидеть результаты до mv
спасибо http://www.gnu.org/software/sed/manual/sed.html#Rename-files-to-lower-case
Я помню, как возился с такими вещами. Мне часто было полезно создать скрипт, который вы выполняете, чтобы делать то, что вы хотите:
ie. вывод вашего скрипта будет файл типа:
mv file1 file2
mv file3 file4
.....
mv fileN fileM
чтобы создать это, просто сделайте ls / grep дата шаблон / sed скрипт для вставки MV file1 в file2 > myscript
потом просто выполнить ./ myscript
таким образом, у вас есть лучший взгляд на промежуточный вывод, чтобы понять что происходит не так.
этот тривиальный вариант у меня работает:
$ cat mapper
for filename in ?*.jpg
do
newFilename=$(echo $filename | \
sed -e 's/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9]\)\./newyears_20--_0./' \
-e 's/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9][0-9]\)/newyears_20--_/')
echo mv $filename $newFilename
done
$ echo > img_04-23-09_123.jpg
$ echo > img_08-13-08_33.jpg
$ sh mapper
mv img_04-23-09_123.jpg newyears_2009-04-23_123.jpg
mv img_08-13-08_33.jpg newyears_2008-08-13_033.jpg
$
единственное различие заключается в использовании явного -e
опции вместо двоеточия.
протестировано на MacOS X 10.6.7.
это может быть обработано чисто скриптом bash.
for j in ?*.jpg
do
n="newyears_20${j:10:2}-${j:4:2}-${j:7:2}";
if [ ${j:15:1} = "." ];then
n="${n}_0${j:13}"
else
n="${n}${j:12}"
fi
mv $j $n
done
Рубин(1.9+)
$ ruby -e 'Dir["img*jpg"].each{|x|File.rename(x,x.gsub(/img_(.*?)-(.*?)-(.*?)\.jpg/,"newyears_20\2-\1-\3.jpg") )}'