как изменить расширения файлов в каталоге [закрыто]

У меня много файлов в каталоге с расширением.

.text(2)
.text(1)

Я хочу удалить цифры из расширения и вывести на выходе что-то вроде

.text 
.text

Может ли кто-нибудь помочь мне со сценарием оболочки для этого? Я использую CentOs 6.3.

4
задан 10 June 2015 в 13:31

4 ответа

Запустите остроту в папке, где файлы сохранены или изменяют путь для эти find команда. В следующих примерах find . путь . (точка).

Тест с:

find . -type f -print0 | xargs -I{} -0 rename -v -n  's/\([0-9]+\)$//' {}

Переименовывают с:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}

команда находит все файлы рекурсивно и удаляет все случаи (<any_number>) в конце имени файла.

Удаляют $ в 's/\([0-9]+\)$//' для удаления всех случаев куда-нибудь в имени файла, например:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)//' {}
<час>

Пример:

% ls -oga
-rw-rw-r--  1 0 Jun 10 09:34 .foo(1)
-rw-rw-r--  1  0 Jun 10 09:34 .bar(2)
% find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}
% ls -aog
-rw-rw-r--  1    0 Jun 10 09:34 .foo
-rw-rw-r--  1    0 Jun 10 09:34 .bar
0
ответ дан 10 June 2015 в 13:31
for i in *.text*; do mv "$i" "$(echo "$i" | sed 's/([0-9]\{1,\})$//')"; done 

просто потребность изменить расширение (.text или любое другое расширение) согласно потребности.

0
ответ дан 10 June 2015 в 13:31

Использование python:

#!/usr/bin/env python2
import os, re
for root, dirs, files in os.walk('/path/to/directory'):
    for f in files:
        oldname = os.path.join(root, f)
        newname = os.path.join(root, re.search(r'(?<=/)[^/]+(?=\(\d+\)$)', oldname).group())
        os.rename(oldname, newname)

Учитывая, что первая часть имен файлов различна (как вы уже упоминали), поэтому шансов на перезапись нет.

  • os.walk будет проходить по всем подкаталогам в указанном каталоге.

  • oldname будет содержать имя файла, подлежащего изменению. os.path.join добавит имя файла с путем к каталогу с помощью os.path.join

  • newname будет содержать имя, на которое oldname будет изменено. Здесь мы использовали модуль re, чтобы получить имя файла, а затем добавили имя файла к пути к каталогу. os.path.join

  • os.rename просто переименуют файлы соответственно.

    [+1116]

До:

foo
├── 1 spam.text(1)
├── 1.text(23)
└── bar
    ├── 1 egg.text(10)
    └── 3test.text(5)

После:

foo
├── 1 spam.text
├── 1.text
└── bar
    ├── 1 egg.text
    └── 3test.text
0
ответ дан 10 June 2015 в 13:31

Это - "дополнительный комментарий" и не полный ответ отдельно.

Это - действительно длинный путь 'объяснить' незначительное понятие - будет казаться длинным и педантичным кроме того, если читатель упустил суть.

Краткое изложение:

, Если существует больше чем один файл имени как foo.txt [(n)]

  • foo.txt, foo.txt (1) - переименовывает->, никакое изменение
    Не Появляется, что ничего не произошло. Это сделало.

  • foo.txt (1), foo.txt (2) - переименовывает-> foo.txt, foo.txt (2) (вероятно)
    Один переименованный файл, один нет.

<час>

Дольше:

Вы говорите, что у Вас нет дубликатов файлов.
можно быть корректны
, НО - следующее тривиально очевидно, если Вы знаете это, но тонкое прерывание, если Вы не встретили его прежде.

, Насколько система затронута

foo.txt = = foo.txt (1) = = foo.txt (2) = и т.д.

независимо от содержания файла или размера.

т.е. Если у Вас есть два имени файлов foo.txt с или без (n) после них тогда, система думает, что они - дубликаты, и/или они - дубликаты.
Так или иначе, переименовать процесс перестанет работать.

, Если переименовать процесс создал бы два файла с тем же именем тогда, это перестанет работать, когда попытка будет предпринята для создания 1-го дубликата. Но

В одном случае отказ не создаст вывода, таким образом, будет казаться, что "ничего не произошло", когда действительно "копирование перестало работать должный назвать коллизию", произошел. Этот случай происходит, когда один файл не имеет никакого (n), суффикс и еще один имеют.
, например, если бы существующими файлами является foo.txt и foo.txt (1) тогда, переименовывание foo.txt (1) создало бы дубликат, если позволено, так не произойдет, и таким образом, никакое действие не произойдет.
foo.txt, foo.txt (1)-> никакое изменение

, Но если бы существующие файлы, например, foo.txt (1) и foo.txt (2) тогда, переименовывание foo.txt (1) НЕ создало бы дубликат, так произойдет, НО переименовывание foo.txt (2) впоследствии создало бы дубликат, если позволено, таким образом, никакое second-file-rename действие не произойдет.
foo.txt (1), foo.txt (2)-> foo.txt, foo.txt (2) (вероятно)

0
ответ дан 10 June 2015 в 13:31

Другие вопросы по тегам:

Похожие вопросы: