LINUX.ORG.RU

Помогите скриптом (bash)


0

0

Суть скрипта в рекурсивном отлавливании пробелов в названиях файлов и дирректорий и замене их на _.

По идее сначала надо запустить find как то так, что бы он рекурсивно искал файлы и дирректории с пробелом в имени (как???), попутно считая количество результатов поиска (поместить find в условие цикла а в самом цикле i++), потом надо запустить цикл с количеством шагов i в котором каким то образом заставить переименовыватся сами результаты поиска (как???)...

Мозгов не хватает реализовать. Помогите пожлуйста.

anonymous

сначала только файлы, потом только каталоги с обратной сортировкой вывода find

anonymous
()

ну как-нибудь так:

dir=/path/to

for i in $(find $dir -type -f -name '* *'); do mv $i $(dirname $i)/$(basename $i| tr ' ' '_'); done

for i in $(find $dir -depth -type -d -name '* *'); do mv $i $(dirname $i)/$(basename $i| tr ' ' '_'); done

Slavaz ★★★★★
()
Ответ на: комментарий от xydo

Second edition с оптимизацией.:)

IFS=$'\n'; for i in $(find $dir -depth -name '* *'); do mv $i $(dirname $i)/$(basename $i| tr ' ' '_'); done

Всё в одну строчку.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

)

вот если бы еще одной командой... в смысле не для скрипта, а для консоли...

наверное только с помощью sh -c

xydo ★★
()
Ответ на: комментарий от xydo

немного не понял что нужно. Выполнить одной командой в командной строке?
Прямо в консоли набери:

spacesKiller(){ dir=shift; FS=$'\n'; for i in $(find $dir -depth -name '* *'); do mv $i $(dirname $i)/$(basename $i| tr ' ' '_'); done; }

и потом в командной строке:
spacesKiller /path/to/dir

если используется постоянно - добавь в ~/.bash_profile

Или не понял я чего-то? Запуск в составе команды?

sh -c "FS=\$'\n'; for i in \$(find "$dir" -depth -name '* *'); do mv \$i \$(dirname \$i)/\$(basename \$i| tr ' ' '_'); done"

?

Slavaz ★★★★★
()

Вот ещё интересный способ:

rename() { 
 (
   cd "${1:-.}";
   ls | while read f; do
    if [[ -d "$f" ]]; then
     rename "$f" || return $?;
    fi;
    if [[ "$f" =~ ' ' ]]; then
     mv -v "$f" "${f// /_}" || return $?;
    fi;
   done
 )
}

rename "$dir"

Jini ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.