У меня много файлов в каталоге с расширением.
.text(2)
.text(1)
Я хочу удалить цифры из расширения и вывести на выходе что-то вроде
.text
.text
Может ли кто-нибудь помочь мне со сценарием оболочки для этого? Я использую CentOs 6.3.
Запустите остроту в папке, где файлы сохранены или изменяют путь для эти 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
for i in *.text*; do mv "$i" "$(echo "$i" | sed 's/([0-9]\{1,\})$//')"; done
просто потребность изменить расширение (.text или любое другое расширение) согласно потребности.
Использование 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
просто переименуют файлы соответственно.
До:
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
Это - "дополнительный комментарий" и не полный ответ отдельно.
Это - действительно длинный путь 'объяснить' незначительное понятие - будет казаться длинным и педантичным кроме того, если читатель упустил суть.
Краткое изложение:
, Если существует больше чем один файл имени как 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) (вероятно)