додавання тексту до імені файлу перед розширенням


25

Я хотів би додати текст до кінця імені файлу, але перед розширенням. Зараз я намагаюся,

for f in *.shp; do echo $f_poly; done

вихід є,

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

Я хочу, щоб це було,

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

Відповіді:


27

Використання стандартного розширення параметрів POSIX :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

Дивовижно, саме це мені було потрібно.
Sam007

1
Можливо, краще поясніть, як це працює. Відповідь Дуга досить легко, з іншого боку.
Sarge Borsch

@SargeBorsch Що вам потрібно пояснити? Моя відповідь, фрагмент запитання та відповідь Дуга відрізняються лише кількома символами, а відповідь Дуга пояснює навіть менше, ніж моя, тому я не знаю, чого це ви хочете. Якщо ви просто порівнюєте різницю двох результатів у питанні, то слід розібратися, що вони роблять. Я можу пояснити, чому моя відповідь є кращою для дугової. 1. Я використовую printfрядок формату замість менш портативного echo. 2. Я використовую розширення параметрів, яке є більш ефективним, ніж викликати зовнішній бінарний ( basename) для такої простої задачі.
jw013

Тоді команда перейменувати файли буде такою:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

Іноді встановлений інструмент під назвою "перейменувати".

rename 's/\.shp$/_poly.shp/' *shp

Це може бути не портативним, але він простий у використанні.


1
Це єдиний, хто працював на мене, чудова відповідь!
wanderer0810

4

Використовуй це:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
Використання basenameповільніше і менш ефективно, ніж дозволяти оболонці виконувати роботу самостійно. Це може бути помітно для дуже великої кількості файлів.
jw013

Крім того, відсутні відсутні лапки і --s, і це не вдається для імен файлів, які мають символи нового рядка перед .shp.
Стефан Шазелас

Дякую за те, що дав відповідь, з яким я можу реально працювати з моєю метою. Це баш-допомога, а не код гольфу. (Читання над цим .. Я розумію , що це може звучати як я був сарказм Більше захоплення про інших відповідях на тут , ніж ваші Ще раз спасибі.)
Тім

3

Це працювало для мене краще:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


Ну, це схоже на прийняту відповідь, за винятком того, що ви, мабуть, хочете for f in *.webm, ви забули процитувати це, ${f}і вам не вистачає --.
Стефан Шазелас

1
Прийнята відповідь не працює на OSX, вона виводить лише нові імена файлів, вона фактично не перейменовує файли
Vinnie James

1
Звичайно, він показує, як використовувати розширення оболонки для отримання нового імені файлу, відповідаючи на питання, яке також виводить ім'я файлу (з echo), але не потрібне.
Стефан Шазелас

1

Якщо вони знаходяться в різних місцях, тоді запустіть: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

Оскільки питання в тому, bashщо немає необхідності у зовнішніх утилітах, оскільки ви можете використовувати bash regexps :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.