2012-03-02 1 views
0

Я пытаюсь написать сценарий bourne-shell, который берет каталог как параметр и ищет изображения с именем ixxx.a и переименовывает их в ixxx_a.img, где «xxx означает добавочный номер для Exemple файлы изображений будут называться i001.a, i002.a, i003.a ...) вот что я пыталсяпереименовать файл в оболочке bourne

mv $1/f[0-9][0-9][0-9].a $1/f[0-9][0-9][0-9]_a.img 

, но он говорит, что DEST не является каталогом. Любая помощь будет много

+0

'mv' это не эта магия. [Ларри Уолл написал сценарий переименования в Perl] (http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm), который может быть немного более волшебным, но требует написание крошечного фрагмента кода Perl каждый раз вы используете его. – sarnold

ответ

1
for i in $1/f[0-9][0-9][0-9].a; do 
    mv $i ${i%.a}_a.img 
done 

Однако это не рассматривает пробелы в именах файлов/папок. В этом случае вам придется использовать while, чтобы вы получили одно имя файла в строке (см. Ниже бонус). Есть, вероятно, десятки других способов, в том числе rename.

find $1 -maxdepth 1 -type f -name "f[0-9][0-9][0-9].a"|while read i; do 
    mv "$i" "${i%.a}_a.img" 
done 

Edit: Возможно, я должен объяснить, что я там делал. Это называется строка замещения и основные варианты использования их для переменной var:

# Get first two characters 
${var:0:2} 
# Remove shortest rear-anchored pattern - this one would give the directory name of a file, for example 
${var%/*} 
# Remove longest rear-anchored pattern 
${var%%/*} 
# Remove shortest front-anchored pattern - this in particular removes a leading slash 
${var#/} 
# Remove longest front-anchored pattern - this would remove all but the base name of a file given its path 
# Replace a by b 
${var//a/b} 
${var##*/} 

Для более см man страницу.

+0

amzazing !! Большое вам спасибо – Glove

+0

, если его не слишком много спросят, можете ли вы объяснить, почему '' $ {i% .a} _a.img "' – Glove

+1

@biz: добавлены некоторые объяснения, поэтому для вас это не просто черная магия. – 0xC0000022L