Удалить определенные символы в имени файла в Linux - PullRequest
0 голосов
/ 06 мая 2020

У меня есть файлы в каталоге, например

FILE1.docx.txt
FILE2.docx.txt
FILE3.docx.txt
FILE4.docx.txt
FILE5.docx.txt

И я хотел бы удалить .docx из всех из них, чтобы получить окончательный результат, например

FILE1.txt
FILE2.txt
FILE3.txt
FILE4.txt
FILE5.txt

Как мне сделать это?

Ответы [ 3 ]

3 голосов
/ 06 мая 2020

С Расширением параметра и mv

for f in *.docx.txt; do
  echo mv -vn "$f" "${f%%.*}.${f##*.}"
done

Однострочным

for f in *.docx.txt; do echo mv -vn "$f" "${f%%.*}.${f##*.}"; done        

Удалите echo, если вы считаете, что вывод правильный , чтобы переименовать файлы.

Должно работать в любой POSIX совместимой оболочке, без каких-либо скриптов.


С bash включите опцию nullglob оболочки, чтобы глобус *.docx.txt не будет расширяться как буквальный *.docx.txt, если нет файлов, оканчивающихся на .docx.txt

#!/usr/bin/env bash

shopt -s nullglob

for f in *.docx.txt; do
  echo mv -vn "$f" "${f%%.*}.${f##*.}"
done

ОБНОВЛЕНИЕ: благодаря @Léa Gris добавить nullglob измените глобус на *.docx.txt и добавьте -n к mv, хотя -n и -v не определены POSIX согласно https://pubs.opengroup.org/onlinepubs/9699919799/utilities/mv.html Это должно быть как в GNU, так и в BSD mv

1 голос
/ 06 мая 2020

Просто запустите этот python скрипт в той же папке, что и файлы:

import os

for file in os.listdir(os.getcwd()):
    aux = file.split('.')
    if len(aux) == 3:
        os.rename(file, aux[0] + '.' + aux[2])
0 голосов
/ 06 мая 2020

вы можете использовать sed и bash вот так:

for i in *.docx.txt
do
    mv "$i" "`echo $i | sed 's/.docx//'`"
done
...