Вопрос: Удалить часть имени файла, используя для цикла в терминале


В терминале, использующем цикл for, мы можем добавить часть до или после имени файла. Но если мы хотим удалить его, как мы это сделаем? Например, мы можем добавить .old после всех имен файлов .txt, используя команду ниже

$for i in *.txt
>do
>    mv $i $i.old
>    done

Но мой вопрос заключается в том, как удалить этот .old, используя ту же технику?


4
2017-09-21 21:37


Источник




Ответы:


for i in *.txt; do mv $i ${i%%.txt}; done

Это просто для цикла, как и тот, который вы написали. Заметка, которую я использовал; вместо новых строк, чтобы я мог ввести его в одну строку. Единственной конструкцией, которая для вас является новой, является $ {i %%. Txt}, которая просто означает $ i, причем все, что следует за символами %%, отрезанными от конца $ i.

Хороший совет: если вы не знаете, что произойдет, попробуйте добавить эхо перед фактической командой, чтобы вы увидели точные команды, которые должны быть выполнены. Например.:

for i in *.txt; do echo mv $i ${i%%.txt}; done 

2
2017-09-21 22:37



Не могли бы вы объяснить, что делает каждая часть команды? - Braiam
Это просто для цикла, как и тот, который вы написали. Заметка, которую я использовал; вместо новых строк, чтобы я мог ввести его в одну строку. Единственной конструкцией, которая для вас является новой, является $ {i %%. Txt}, которая просто сопоставляется с $ i, причем все, что следует за знаками %%, отключенными от конца $ i. - Agoston Horvath
Хороший совет: если вы не знаете, что произойдет, попробуйте добавить эхо перед фактической командой, чтобы вы увидели точные команды, которые должны быть выполнены. Например, для i в * .txt; do echo mv $ i $ {i %%. txt}; сделанный - Agoston Horvath
Хорошо, вы могли бы добавить это к реальному ответу? - Braiam


В виде это web говорит ... вы можете попробовать Строковые манипуляции bash

Вы можете использовать два разных «оператора» внутри параметров (фигурные скобки). Это # и % операторов для обрезки шаблонов с начала или конца строки.

Ваш случай может быть:

$ {variable% pattern} Обрезать кратчайшее совпадение с конца

В Терминале будет:

for i in *.old
do 
mv $i ${i%\.*}
done

Здесь у вас есть примеры:

Данный:

Foo = / TMP / my.dir / filename.tar.gz

Мы можем использовать эти выражения:

path = $ {foo% / *}

Чтобы получить: /tmp/my.dir (например, dirname)

file = $ {foo ## * /}

Чтобы получить: filename.tar.gz (например, basename)

base = $ {file %%. *}

Получить: имя_файла

ext = $ {file # *.}

Получить: tar.gz


$ {Переменная шаблона%}

Обрезать кратчайший матч с конца

$ {Переменная ## паттерн}

Обрезать самое длинное совпадение с самого начала

$ {Переменная %% шаблон}

Обрезать самый длинный матч с конца

$ {Переменная шаблона #}

Обрезать кратчайший матч с самого начала

Надеюсь, поможет.


1
2017-09-21 22:36