В терминале, использующем цикл for, мы можем добавить часть до или после имени файла. Но если мы хотим удалить это, как мы делаем это? Например, мы можем добавить .old после всех имен файлов .txt, используя команду ниже
$for i in *.txt
>do
> mv $i $i.old
> done
Но мой вопрос: как нам удалить этот .old, просто используя ту же технику?
for i in *.txt; do mv $i ${i%%.txt}; done
Это простой цикл, как тот, который вы написали. Примечание, которое я использовал; вместо новых строк, чтобы я мог ввести его в одну строку. Единственная конструкция, которая является новой для вас, это $ {i %%. Txt}, что просто означает $ i, а все последующие знаки %% отсечены от конца $ i.
Хороший совет: если вы не уверены, что произойдет, попробуйте добавить echo перед фактической командой, чтобы увидеть точные команды, которые должны быть выполнены. Например :
for i in *.txt; do echo mv $i ${i%%.txt}; done
Как эта сеть говорит ... вы можете попробовать bash String Manipulations
Вы можете использовать два разных «оператора» внутри параметров (фигурные скобки), Это операторы # и % для обрезания шаблонов по началу или концу строки.
Ваш случай может быть следующим:
$ {variable% pattern} Обрезать самое короткое совпадение с конца
blockquote>В терминале будет:
[ 110]Здесь у вас есть примеры:
Дано:
foo = / tmp / my.dir / filename.tar.gz
Мы можем использовать следующие выражения:
path = $ {foo% / *}
Чтобы получить: /tmp/my.dir (как dirname)
file = $ {foo ## * /}
Чтобы получить: filename.tar.gz (как basename)
base = $ {file %%. *}
To get: filename
ext = $ {file # *.}
Получить: tar.gz
blockquote>
$ {variable% pattern}
Обрезать самое короткое совпадение с конца
$ {variable ## pattern}
Обрезать самое длинное совпадение с начала
$ {variable %% pattern}
Обрезать самое длинное совпадение с конца
$ {variable # pattern}
Обрезать самое короткое совпадение с начала
blockquote> [ 1127] Надеюсь, это поможет с.