LINUX.ORG.RU

как реализовать рекрусивное переименование файлов и каталогов содержащих пробелы?


0

0

на входе имеется ./имя папки/имя папки/имя папки/имя папки/имя папки/имя файла ./имя папки2/имя папки/имя папки/имя папки/имя папки/имя файла на выходе иметь ./имя_папки/имя_папки/имя_папки/имя_папки/имя_папки/имя_файла ./имя_папки2/имя_папки/имя_папки/имя_папки/имя_папки/имя_файла

anonymous

Заюзать питон иль руби там проеблы тебе не будут создавать проблемы.

wfrr ★★☆
()

Хм, с rename красиво получается, но perl'а может и не быть.

Скрипт:

#!/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

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

> find -iname "* *" -print0 |xargs -0 rename "s/ /_/g"
логика конечно железная только
работает это примерно так
.
# нет такой папки
./имя папки
# переименовывается в ./имя_папки и остальные пути перестают быть
# правельными и
./имя папки/имя папки
./имя папки/имя папки/имя папки
./имя папки/имя папки/имя папки/имя папки
./имя папки/имя папки/имя папки/имя папки/имя папки
./имя папки/имя папки/имя папки/имя папки/имя папки/имя файла
уже ничего не переименовывается.

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

Кстати да, мой скрипт должен это нормально обрабатывать.

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

форматирование подвело

А если символ новой строки в файле?

$ : > 'aaa xxx
ccc.txt'

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

> Поставить винду и не называть директории папками. в моем КДЕ при клике правой клавишей мыши можно создать папку и она даже по умолчанию будет называться новая папка так что вопрос к переводчикам.

$ for f in `find ./ -type d -depth`;do mv $f `echo $f | sed s/\ /_/g`;done; find: warning: you have specified the -depth option after a non-option argument -type, but options are not positional (-depth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

mv: невозможно выполнить stat для `./имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки': No such file or directory mv: невозможно выполнить stat для `./имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки': No such file or directory mv: невозможно выполнить stat для `./имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки': No such file or directory mv: невозможно выполнить stat для `./имя': No such file or directory mv: невозможно выполнить stat для `папки/имя': No such file or directory mv: невозможно выполнить stat для `папки': No such file or directory mv: невозможно выполнить stat для `./имя': No such file or directory mv: невозможно выполнить stat для `папки': No such file or directory mv: `./' и `./.' - один и тот же файл

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

с разделителем напутал

тогда что-то типа:

#!/bin/bash

T=echo $IFS;

IFS=`echo -e "\n\r"`;

for old in `find ./ -mindepth 1 -depth -type d`;do

mv "$old" "${old%/*}/`echo \"${old##*/}\" | sed s/\ /_/g`"

done;

IFS=$T

anonymous
()

find /path/to/someWhere -exec sh -c 'a="{}"; b=$( echo "$a" | tr \ _ ); mv "$a" "$b"' \;

или

find /path/to/someWhere | sed 's/^.*$/\\"&\\"/p; y/ /_/' | xargs -L2 mv

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

Я бы так сделал:

find /path/to/someWhere -depth -name '* *' -print0 | awk '
    BEGIN{ORS=OFS=RS="\0"}
    {new = $0; gsub(/ /,"_",new); print $0,new}' | xargs -0n2 mv

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