удаление расширений в подкаталогах - PullRequest
1 голос
/ 30 июля 2009

Мне нужно удалить расширение ".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. Сед и найди

  2. Рубин

  3. Python

Мой бедный Попробуй:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +

Ответы [ 5 ]

4 голосов
/ 30 июля 2009

Сценарий 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')
1 голос
/ 30 июля 2009

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

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

0 голосов
/ 30 июля 2009

Существует отличный сценарий переименования Perl, который поставляется с некоторыми дистрибутивами, в противном случае вы можете найти его в Интернете. (Я не уверен, где он находится официально, но вот оно ). Проверьте, написано ли ваше переименование Ларри Уоллом (раздел АВТОР 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.

0 голосов
/ 30 июля 2009

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

Лучшим подходом является нахождение поиска в следующем процессе.

Пример:

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

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

0 голосов
/ 30 июля 2009

Используя 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 ...

...