Вопрос

Мне нужно удалить расширение ".tex".:

./1-aoeeu/1.tex
./2-thst/2.tex
./3-oeu/3.tex
./4-uoueou/4.tex
./5-aaa/5.tex
./6-oeua/6.tex
./7-oue/7.tex

Пожалуйста, сделайте это с помощью приведенных ниже инструментов:

  1. Sed и найти

  2. Рубин

  3. Питон

Моя Бедная попытка:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
Это было полезно?

Решение

Python-скрипт для того же:

import os.path, shutil

def remove_ext(arg, dirname, fnames):
    argfiles = (os.path.join(dirname, f) for f in fnames if f.endswith(arg))
    for f in argfiles:
        shutil.move(f, f[:-len(arg)])

os.path.walk('/some/path', remove_ext, '.tex')

Другие советы

Один способ, не обязательно самый быстрый (но, по крайней мере, самый быстрый):

<код>

    pax> for i in *.c */*.c */*/*.c ; do
    ...> j=$(echo "$i" | sed 's/\.c$//')
    ...> echo mv "$i" "$j"
    ...> done

Это эквивалентно, так как ваша maxdepth равна 2. Сценарий просто повторяет команду mv в данный момент (для целей тестирования) и работает с файлами C (поскольку у меня не было tex файлы для проверки).

Или вы можете использовать find со всей своей мощью следующим образом:

<код>

    pax> find . -maxdepth 2 -name '*.tex' | while read line ; do
    ...> j=$(echo "$line" | sed 's/\.tex$//')
    ...> mv "$line" "$j"
    ...> done

Использование "for i in" может привести к ошибкам "слишком большого количества параметров"

Лучший подход - перенести find в следующий процесс.

Пример:

find . -type f -name "*.tex" | while read file
do
    mv $file ${file%%tex}g
done

(Примечание:Не будет обрабатывать файлы с пробелами)

Используя bash , find и mv из вашего базового каталога.

 for i in $(find . -type f -maxdepth 2 -name "*.tex"); 
 do 
    mv $i $(echo "$i" | sed 's|.tex$||'); 
 done
<Ч>

Вариант 2 , основанный на других ответах здесь.

find . -type f -maxdepth 2 -name "*.tex" | while read line; 
do 
   mv "$line" "${line%%.tex}";  
done
<Ч>

PS: я не получил информацию о экранировании . с помощью pax ...

Существует отличный сценарий переименования Perl, который поставляется с некоторыми дистрибутивами, в противном случае вы можете найти его в Интернете. (Я не уверен, где он находится официально, но это так и есть ) , Проверьте, написано ли ваше переименование Ларри Уоллом (раздел AUTHOR в man rename ). Это позволит вам сделать что-то вроде:

find . [-maxdepth 2] -name "*.tex" -exec rename 's/\.tex//' '{}' \;

Использовать -exec здесь проще всего, потому что нужно выполнить только одно действие, и не так уж и дорого вызывать переименование несколько раз. Если вам нужно сделать несколько вещей, используйте " при чтении " форма:

find . [-maxdepth 2] -name "*.tex" | while read texfile; do rename 's/\.tex//' $texfile; done

Если у вас есть что-то, что вы хотите вызвать только один раз:

find . [-maxdepth 2] -name "*.tex" | xargs rename 's/\.tex//'

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top