удаление расширений в подкаталогах
Вопрос
Мне нужно удалить расширение ".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
Пожалуйста, сделайте это с помощью приведенных ниже инструментов:
Sed и найти
Рубин
Питон
Моя Бедная попытка:
$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.