LINUX.ORG.RU

Епта. Пробел = "\ ", и какой к черту rename на месте sed'а? И эта... 'find ./ -type f'

Gharik
()

find * -name '* *' -print | rename 's/ /_/g'

anonymous
()

Я пользуюсь find ..... -print0 | xargs -0 ..... Потому как, если в имени какой-нить корявый символ, то можно налететь.

lego_12239
()
Ответ на: комментарий от sdio

find . -name '* *' -exec rename 's/ /_/g' {} \;
Нифига, не работает.

>Епта. Пробел = "\ ", и какой к черту rename на месте sed'а? 
А как ты кстати это sed'ом делаешь?

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

find . -name '* *' -type f -printf 'mv "%p" $(echo "%p"|tr " " _)\n'|sh
                   ^^^^^^^
                   чтобы не трогать каталоги

Без -type f не будет работать с файлами, которые лежат в каталогах с
пробелом в имени. Если каталог переименуется раньше файла,
то вместо %p будет подставлено путевое имя, которое содержит старое
имя каталога, и mv получит неправильное имя файла.

>рекурсивно заменить пробелы подчеркиванием
 ^^^^^^^^^^
Вот и делайте рекурсивно

deep_rename() {
   local fname
   local Old=$(pwd)

   cd "$1"
   for fname in *;do
       if [ -d "$fname" ]; then
           deep_rename "$fname"
       fi
       case "$fname" in
          *" "*) mv "$fname" $(echo "$fname"|tr " " _);;
       esac
   done
   cd "$Old"
}

deep_rename blah-blah

ЗЫ
   Сначала проверьте это на кошках, код не тестировал. 

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

Мои пять копеек:

#!/bin/bash
# replace spaces in arguments with '_'
# lren.sh works recursively in subdirectories!
# command to rename all files in a current directory and in 
# subdirectories for example:
# lren.sh ' ' '_' *

if [[ $# -lt 3 ]]; then
    printf "Usage: %s SRC_STR DEST_STR FILE...\n" $0
    exit 1
fi
src_str="$1"
dest_str="$2"
shift 2

for i ;do
    a=${i//"$src_str"/"$dest_str"}
    mv "$i" "$a"
    if [[ -d "$a" ]]; then
        find "$a" -maxdepth 1 -mindepth 1 -print0 | xargs -0 $0 \
                "$src_str" "$dest_str"
    fi
done

P.S. Проверено - работает.

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

> > Епта. Пробел = "\ ", и какой к черту rename на месте sed'а? 
> А как ты кстати это sed'ом делаешь?

В основном напильником вроде этого:

find ./ -type f -name '* *' -exec mv -v '{}' "$(echo '{}' | sed -e 's@ @_@g')" ';'

Хотя по идее нужно писать корректный скрипт, спускающийся в дерево и не трогающий директории.

Gharik
()

так тоже можно:

#!/usr/bin/perl
sub ren
{ foreach (`ls -aA1 "@_[0]" | grep ""`)
    {  chomp;
        ren("@_[0]/$_") if (-d "@_[0]/$_");
        my $n=$_; ~s/ /_/g;
        rename("@_[0]/$n","@_[0]/$_") if ($n ne $_); }; };
ren(".");

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