Bash переименовывает рекурсивное расширение

Я знаю, что существует много вещей как это вокруг, но или они не работают рекурсивно, или они огромны.

Это - то, что я получил:

find . -name "*.so" -exec mv {} `echo {} | sed s/.so/.dylib/` \;

Когда я просто выполняю часть находки, она дает мне список файлов. Когда я выполняю sed часть, она заменяет любой .so .dylib. Когда я выполняю их вместе, они не работают.

Я заменил mv эхом для наблюдения то, что произошло:

./AI/Interfaces/C/0.1/libAIInterface.so ./AI/Interfaces/C/0.1/libAIInterface.so

Ничто не заменяется вообще!
Что не так?

12
задан Pepijn 31 January 2010 в 14:17
поделиться

4 ответа

for X in `find . -name "*.so"` 
do
 mv $X ${X/.so/.dylib}
done
4
ответ дан 2 December 2019 в 04:08
поделиться

Ему нуждается в рекурсии:

#!/bin/bash

function walk_tree {
    local directory="$1"
    local i

    for i in "$directory"/*; 
        do
            if [ "$i" = . -o "$i" = .. ]; then 
                continue
            elif [ -d "$i" ]; then  
            walk_tree "$i"  
            elif [ "${i##*.}" = "so" ]; then
                echo mv $i ${i%.*}.dylib    
            else
                continue
            fi
        done    
}

walk_tree "."
0
ответ дан 2 December 2019 в 04:08
поделиться

Если у вас есть Bash 4

#!/bin/bash

shopt -s globstar
shopt -s nullglob
for file in /path/**/*.so
do
 echo mv "$file"  "${file/%.so}.dylib"
done
1
ответ дан 2 December 2019 в 04:08
поделиться

Что неверно, это то, что

echo {} | sed s/.so/.dylib/
выполняется только один раз, до того, как запущен find sed {} на его входе {} {} {} на его входе, который не совпадает /.so/ и остается без изменений, поэтому ваша полученная командная строка
find . -name "*.so" -exec mv {} {}
3
ответ дан 2 December 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: