LINUX.ORG.RU
Ответ на: zsh от salsa

Выжрало всю память и упало вместе с сервером. Будь ты проклят!

anonymous
()
Ответ на: комментарий от zolden

Вы не подонки с вашими подставами?

anonymous
()

замена пробелов
for file in *

Ты так пробелы не заменишь.

Вот это

sed 's/[^.[:alnum:]]/_/g'

точно должно так выглядеть, а не, скажем, так:

sed 's/^.[[:alnum:]]/_/g'
Я когда-то вот такой велосипед делал:
#!/bin/sh
# this script has been written by Eddy 
#
#		rmspaces -- убирает пробелы в именах файлов
#
# Создан 20-го Сентябрь 2004 года в 20:57
#
list=/tmp/rmspaces.$$
ls -1 > $list

while read file
do
    new=`echo "$file" | sed "s/\ /_/g"`
    if [ "$new" != "$file" ]; then
	mv "$file" "$new"
	echo "$file  RENAMED INTO   $new"
    fi
    if [ "$1" = "-r" -a -d "$new" ]; then
        cd "$new"
	echo -e "\t\tDiving into $PWD"
        rmspaces -r
        cd ../
    fi
done < $list
rm $list
а вообще, можно, как уже говорили, сделать при помощи find, передав результат в xargs, но чтобы правильно обрабатывать пробелы, делать -print0 у find'а.

Eddy_Em ☆☆☆☆☆
()

То, что я написал в открывающем тему посте, это реально работающий скрипт. Но! В заданной папке. Нужно просто добавить нечто, чтобы он по всем папкам диска от начала до конца прошелся. Не знаю, как.

LittleBin
() автор топика
Ответ на: комментарий от amomymous

Главное правило лора: запускать только то, что понял от начала до конца.

LittleBin
() автор топика

И у меня в теме речь о замене не только пробелов, а всего, что не есть точка (чтобы сохранить расширения для использования файлов на других ОС) и не альфанумерик, в т.ч. кавычек, скобок и прочего мусора.

LittleBin
() автор топика
Ответ на: zsh от salsa

Идея интересная, спасибо!

LittleBin
() автор топика
Ответ на: комментарий от amomymous

При чем тут рут? Запускать в командной оболочке zsh. И добавить в zshrc/zshenv(в зависимости от способа использования)

autoload -Uz zmv
. И я там опечатался, надо noglob, а не noglog , а еще лучше сделать alias zmv='noglob zmv'.

salsa
()
Последнее исправление: salsa (всего исправлений: 1)
$ cat myrename.sh

#!/bin/sh
####### START ########
for file in "$@"; do 
     DIR=$(dirname "$file")
    FILE=$(basename "$file")
    mv "$file" $DIR/$(echo "$FILE" | sed 's/[^.[:alnum:]]/_/g; ; s/.*/\L&/')
done
######## END #########

find /path/to/dir -type f -exec myrename.sh {} +
anonymous
()
Ответ на: комментарий от anonymous
find /path/to/dir -type f -exec rename 's/[^.\w]/_/g; $_=lc($_)' {} +
anonymous
()

Интересно, спасибо. А точно, что с rename \w для не ascii работает? Имена файлов же бывают не только ascii, может и хирагана быть.

LittleBin
() автор топика
Ответ на: комментарий от anonymous

Чистый баш, никаких форков внешних утилит (кроме mv)

$ cat myrename.sh

#!/bin/sh
####### START ########
for file in "$@"; do 
    DIR=${file%/*}
    FILE=${file##*/}
    FILE=${FILE//[^.[:alnum:]]/_}
    FILE=${FILE,,}
    mv "$file" "$DIR/$FILE"
done
######## END #########

find /path/to/dir -type f -exec myrename.sh {} +

anonymous
()
Ответ на: комментарий от LittleBin

что я написал в открывающем тему посте, это реально работающий скрипт.

Что не отменяет того, что он ужасен.

Нужно просто добавить нечто, чтобы он по всем ... прошелся.

Со всей очевидностью это «нечто» зовется рекурсией.

Ладно, держите набросок. Не проверял, могут быть ошибки вплоть до синтаксических.

#!/bin/bash

shopt -s nullglob

cd "$1"

for filename in *; do
    newfilename="${filename//[^.[:alnum:]]/_}"
    newfilename="${newfilename,,}" # to lowercase
    [[ "$filename" != "$newfilename" ]] \
        && mv -- "./$filename" "./$newfilename"
done

for dirname in */; do
    "$0" "$dirname"
done

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от LittleBin

взял идею find -exec скрипт. Спасибо!

Еще раз — у вас каталоги недопустимых символов, что надо заменить, в именах не содержат? Если содержат, то файнд вам не пригодится.

Zmicier ★★★★★
()

Чтобы рекурсивно переименовать, надо отсортировать в обратном порядке. Тогда сначала переименует файлы, следом — директории в которых эти файлы.

find "${DIR}" -name "* *"| sort -r | while read x; do
    mv "${x}" "$(dirname "${x}")/$(basename "${x}" | sed -e 's/ /_/g')";
done

liaonau
()
Ответ на: комментарий от Zmicier

А что, директории не могут содержать недопустимые символы в именах;; откуда такое допущение?

По определению! Если директория существует, то все символы допустимы :-)

Ты что, клоун, собираешься за TC'a задание менять? Иди проспись.

anonymous
()

Зачем чего-то сортировать, когда в скрипте сначала прописывается тип d, а затем тип f.

LittleBin
() автор топика

одной командой

find . -mindepth 1 -depth -print0 | sed -rze "
p
h
s!.*/!!
s![^.[:alnum:]]+!_!g
G
s!^([.[:alnum:]_]*).(.*/).*!\\2\\1!
" | xargs -n 2 -0 -r mv

запускать после бекапа, т.к. вероятность ничего не потерять - процентов 20.

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

А теперь представь, что у тебя там 100500 файлов.

Eddy_Em ☆☆☆☆☆
()
27 июня 2016 г.
rename 's/\ /_/sig' *

но это только в текущем каталоге.

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