2016-03-04 3 views
0

Хорошо, поэтому я как бы бросил мяч. Я пытался понять, как все работает. У меня было несколько html-файлов на моем компьютере, которые я пытался переименовать в txt-файлы. Это было строго учебное упражнение. Следуя инструкции я нашел here используя этот код:Есть ли способ отменить пакетное переименование расширений файлов?

for file in *.html 
do 
mv "$file" "${file%.html}.txt" 
done 

произвел эту ошибку:

mv: rename *.html to *.txt: No such file or directory

Короче говоря, я в конечном итоге будет изгоями и переименование файлов HTML, а также много других не html-файлы в виде txt-файлов. Так что теперь у меня есть файлы, помеченные как

  • my_movie.mp4.txt
  • my_song.mp3.txt
  • my_file.txt.txt

Это может быть очень глупый вопрос, но .. Есть ли способ проверить, имеет ли файл два расширения, и, если да, удалить последний? Или любой другой способ отменить этот беспорядок?

EDIT

Делать это find . -name "*.*.txt" -exec echo {} \; | cat -b кажется, чтобы сказать мне, что изменилось, и где он находится. Часть cat -b не нужна, но мне она нравится. Это все еще не фиксирует, что я сломал.

ответ

0

Я не уверен, что терминал может проверять наличие расширений «дважды», но вы можете проверить для . во всех именах, если имеется более одного входа ., тогда ваш файл имеет больше расширений. Затем вы можете вырезать расширение с поиском первого появления . в строке при движении назад ... или последней, если обычная проверка символов в строке.

У меня есть более быстрый вариант для вас, если вы можете использовать python. Вы можете раздеть расширение с:

for file in list_of_files: 
    os.rename(file,os.path.splitext(file)[0]) 

, который может дать вам от your file.txt.txtyour file.txt

Пример:

Вы написали, что ваша команда говорит вам, что изменилось, так что просто принять эти измененные файлы и сбрасывать их в файл (путь к файлу на строку). Тогда вы можете легко управлять этим:

with open('<path to list>') as f: 
    list_of_files = f.readlines() 
for file in list_of_files: 
    os.rename(file.strip('\n'), os.path.splitext(file.strip('\n'))[0]) 

Если нет, то вы должны были бы получить список из питона:

import os 
results = [] 
for root, folder, filenames in os.walk(<your path to folder>): 
    for filename in filenames: 
     if filename.endswith('.txt.txt'): 
      results.append(os.path.join(root, filename)) 

С этим вы получили список файлов, оканчивающийся .txt.txt подобный это <your folder>\\<path_to_file>.

Получить путь к директории, используемой в os.walk() без имени папки (это уже в списке), так что это будет так:

напримерos.walk('/home/me/directory') ->path='/home/me/' и разрешением является элемент уже в списке, который выглядит как directory/...

for res in results: 
    path = '' # set the path here 
    file = os.path.join(path,r) 
    os.rename(file, os.path.splitext(file)[0]) 

В зависимости от того, что файлы, которые вы хотите найти изменить .txt.txt в if filename.endswith('...') к тому, что вам нравится, и os.rename() будет принимать имя файла без расширения, которое в ваш случай означает, что он разделяет дополнительное расширение, которое вы не хотите иметь.

+0

Это может быть правильно, но у меня есть 0 опыт использования python. Если бы вы могли указать на переменные в своем ответе, это помогло бы мне лучше понять это. –

+0

@ user556068 Я добавил вам пример, поэтому было бы просто использовать python. – KeyWeeUsr

+1

Ух ты, конечно, сделал. Я не хочу нарушать правила, но благодарю вас за этот тщательный ответ. –

Смежные вопросы