У меня есть каталог с автоматически созданными файлами, которые имеют расширение .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