Назад | Перейти на главную страницу

Команда оболочки для удаления расширения файлов

У меня есть каталог с автоматически созданными файлами, которые имеют расширение .sample. Я хотел бы иметь способ удалить расширение .sample из них всех одной командой терминала.

Я пробовал это:

mv ./{$1}*.sample ./$1

Но это не работает, потому что я определенно кладу {$ 1} не в то место и не в том месте. Может ли кто-нибудь указать правильное направление?

Заранее спасибо.

$ touch {a,b,c,"white space"}.sample

$ ls *.sample
a.sample        c.sample
b.sample        white space.sample

$ for SAMPLE in *.sample; do mv -v "$SAMPLE" "${SAMPLE%.sample}"; done
a.sample -> a
b.sample -> b
c.sample -> c
white space.sample -> white space

редактировать: Также см ${parameter#word}, который удаляет word с фронта parameter:

$ FILENAME=140909_stats_report.txt
$ echo "${FILENAME#140909_}"
stats_report.txt

Я вспоминаю, какие из них мне нужны, с позиций # и % клавиши на моей (британской) клавиатуре: # осталось от % так совпадает слева. Прежде чем я заметил, что мне нужно проверить страницу руководства каждый время: ~)

Эти расширения также поддерживают подстановочные знаки оболочки:

$ echo "${FILENAME%.*}"
140909_stats_report

В # и % формы соответствуют кратчайшему расширению word. Ты можешь использовать ## или %% на самый длинный матч. Например.:

$ FILENAME=140909_stats_report.txt
$ echo "${FILENAME#*_}"  # match as little as possible
stats_report.txt
$ echo "${FILENAME##*_}" # match as much as possible
report.txt

С этими расширениями стоит разобраться. Есть еще несколько, в том числе (несколько странная) поддержка регулярных выражений, подстроки и способы установки значений по умолчанию или получения переменной длины. Man bash, конечно.

for n in *.sample ; do mv "$n" "$(basename "$n" .sample)" ; done

В rename команда принимает выражения Perl:

rename 's/\.sample$//' *.sample

Пример:

$ ls *sample*
file0.sample  file2.sample  foo.sample.sample
file1.sample  file3.sample  with space.sample
$ rename 's/\.sample$//' *.sample
$ ls *sample*
foo.sample

В моей системе Ubuntu rename символически привязан к prename сценарий из perl пакет.

rename '.sample' '' *.sample

В Fedora rename команда включена в util-linux-ng пакет.

Один из многих способов сделать это:

for i in *.sample; do NEWNAME=`echo "$i" | sed 's/\.sample//'`; mv "$i" "$NEWNAME"; done