anonymous@RULINUX.NET~# Last login: 2024-11-23 00:37:07
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[bash] задачка под конец рабочего дня

Да, у меня давно рабочий день и башка не варит, а задач еще много.

Вот вам задачка:

есть директория /files/, в ней около 200к файлов и много директорий, поддериктрий и еще кучи файлов в каждой из них. В именах файлов встречаются пробелы(!) и дефисы. Необходимо переименовать все файлы так, чтобы вместо "name-name" было "name - name". То есть, все дефисы заменить на те же дефисы, но с пробелами по обе стороны. Все просто, и я даже такие задачки решать люблю. Но, блин, не под конец 12-часовой смены :(

vitroot(*) (2011-12-18 17:04:50)
Отредактировано vitroot по причине "не указана"
Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: [bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:04:50
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

for p in *; do mv "$p" "${p//-/ - /}"; done

ну или rm -rf *

anonymous(*)(2011-12-18 17:13:27)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от anonymous 2011-12-18 17:13:27
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

не пойдет, переименует и директории, а если зациклишь в find'е, то потом будет запарка с переносами строк, потому что он пробелов левых наштампует

vitroot(*)(2011-12-18 17:26:56)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
[#] [Добавить метку] [Редактировать] Ответ на: [bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:04:50
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

Для текущего каталога типа так (из Advanced Bash-Scripting Guide :) Попробовать на каком-то одном каталоге. Получится - применить скрипт рекурсивно.

bash

#! /bin/bash
# blank-rename.sh
#
# Заменяет дефисы на " - " в именах файлов в текущем каталоге.

ONE=1                     # единственное или множественное число (см. ниже).
number=0                  # Количество переименованных файлов.
FOUND=0                   # Код завершения в случае успеха.

for filename in *         # Перебор всех файлов в текущем каталоге.
do
     echo "$filename" | grep -q "-"         #  Проверить -- содержит ли имя файла
     if [ $? -eq $FOUND ]                   #+ дефисы.
     then
       fname=$filename                      # Удалить путь из имени файла.
       n=`echo $fname | sed -e "s/-/ - /g"`   # Заменить дефисы на дефисы с пробелами.
       mv "$fname" "$n"                     # Переименование.
       let "number += 1"
     fi
done

if [ "$number" -eq "$ONE" ]
then
 echo "$number файл переименован."
else
 echo "Переименовано файлов: $number"
fi

exit 0

 

Bod(*)(2011-12-18 17:28:41)

Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0 Iceweasel/8.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от Bod 2011-12-18 17:28:41
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

э.. а пути-то старые сохранить надо :)

vitroot(*)(2011-12-18 17:39:03)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
[#] [Добавить метку] [Редактировать] Ответ на: [bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:04:50
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

krename для кого писан? :)

Hokum(*)(2011-12-18 18:45:30)

Mozilla/5.0 (X11; Linux x86_64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:26:56
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

> не пойдет, переименует и директории
Что ты ноешь? if [ -d "$p" ] then cd "$p"; <вызвать этот же сценарий>; cd ..; else <то, что было раньше> fi

anonymous(*)(2011-12-18 18:45:30)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от Hokum 2011-12-18 18:45:30
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

>>krename
очень смешно :)

vitroot(*)(2011-12-18 18:58:41)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
[#] [Добавить метку] [Редактировать] Ответ на: [bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:04:50
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

Я бы заюзал дефолтные удилиты без баша

что то вида find -type f -name '*.xxx' -exec rename 's/-/ - /' {} \;

Конечно не быстро но зато просто...

Id(*)(2011-12-18 19:11:44)

Mozilla/5.0 (Linux i686) AppleWebKit/535.4+ (KHTML, like Gecko) WebKitGTK+/1.6.1 luakit
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от Id 2011-12-18 19:11:44
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

и чем оно дефолтнее?

vitroot(*)(2011-12-18 19:18:35)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
[#] [Добавить метку] [Редактировать] Ответ на: [bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:04:50
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

Забудь о bash. Use PERL. Получится что-то вроде:

perl
opendir (DIR, $dir);
my @fileList = readdir DIR;
foreach my $oldname (@fileList) {
 next if -d $oldname;
 $oldname =~ /([a-zA-Z0-9_]*)-([a-zA-Z0-9_]*)/;
 $newname = $1 .. " - " .. $2;
 rename $oldname, $newname;
}
 


Есть скрипт ещё короче, но с зависимостью от File::Rename:

perl
use File::Rename qw(rename);
my @list = `dir`;
rename @list, sub { s/мне-лень-писать/регэксп/ }, 1;
 


Протестировать регэкспы можно тут, тут или тут.

На чистом bash, думаю, придётся связывать в одну команду cat, sed и mv.

Oreolek(*)(2011-12-18 20:04:11)
Отредактировано Oreolek по причине "не указана"
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от vitroot 2011-12-18 19:18:35
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

>и чем оно дефолтнее?
дефолтностью очевидноже, особенно для конца ненормированного раб дня.

В дебе стоит по умолчанию, центосах и сайнтифике не помню, возможно нет.

Тогда +1 к чистому перлу.

Id(*)(2011-12-18 20:16:33)

Mozilla/5.0 (Linux i686) AppleWebKit/535.4+ (KHTML, like Gecko) WebKitGTK+/1.6.1 luakit
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от Oreolek 2011-12-18 20:04:11
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

> На чистом bash, думаю, придётся связывать в одну команду cat, sed и mv.
На баше я привёл пример без всяких cat и sed. Только mv. И даже с заходом в поддиректории и выполнением сценария там.

anonymous(*)(2011-12-18 21:38:35)

[#] [Добавить метку] [Редактировать] Ответ на: [bash] задачка под конец рабочего дня от vitroot 2011-12-18 17:04:50
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

Вы все тут невероятно скучные.

scheme
#!/usr/bin/guile \
-e main -s
!#
(use-modules (ice-9 ftw)
             (ice-9 regex))

(define (main args)
  (let ((ri (make-regexp "([^ ])-([^ ])")))
    (ftw (list-ref args 1)
         (lambda (filename statinfo flag)
           (if (eq? flag 'regular)
               (let ((new-path (format #f "~a/~a" (dirname filename)
                                       (regexp-substitute/global #f ri
                                                                 (basename filename)
                                                                 'pre 1 " - " 2 'post))))
                 (if (string=? new-path filename)
                     (format #t "~a named properly" filename)                    
                     (begin (format #t "Renaming ~a to ~a" filename new-path)
                            (rename-file filename new-path))))
               (format #t "~a not a regular file" filename))
           (newline)
           #t))))
 


Использовать как ./mysuperguilescript.scm /path/to/dir.

SystemV(*)(2011-12-18 22:04:44)

Emacs-w3m/1.4.414 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от SystemV 2011-12-18 22:04:44
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

На похапэ чтоли накатать скрипт тогда. Или еще хлеще на С++/Qt.

Tux-oid(*)(2011-12-18 22:11:20)

Mozilla/5.0 (X11; Linux i686; rv:8.0.1) Gecko/20111121 Firefox/8.0.1 SeaMonkey/2.5
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от SystemV 2011-12-18 22:04:44
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

Еще в номинации думаю могут поучаствовать программы

rename на ассемблере без использования системных вызовов и внешних библиотек

и

rename на basic переименования N файлов не используя циклы и рекурсии.

Id(*)(2011-12-18 22:13:42)
Отредактировано Id по причине -
Mozilla/5.0 (Linux i686) AppleWebKit/535.4+ (KHTML, like Gecko) WebKitGTK+/1.6.1 luakit
[#] [Добавить метку] [Редактировать] Ответ на: Re:[bash] задачка под конец рабочего дня от Tux-oid 2011-12-18 22:11:20
avatar
Скрыть

Re:[bash] задачка под конец рабочего дня

>На похапэ чтоли накатать скрипт тогда. Или еще хлеще на С++/Qt.
На qt5 с QML-гуём и анимацией:)

SystemV(*)(2011-12-18 22:16:47)

Emacs-w3m/1.4.414 w3m/0.5.3
Этот тред читают 2 пользователя:
Анонимных: 2
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!