Я знаю, что существует много вещей как это вокруг, но или они не работают рекурсивно, или они огромны.
Это - то, что я получил:
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
Ничто не заменяется вообще!
Что не так?
for X in `find . -name "*.so"`
do
mv $X ${X/.so/.dylib}
done
Ему нуждается в рекурсии:
#!/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 "."
Если у вас есть Bash 4
#!/bin/bash
shopt -s globstar
shopt -s nullglob
for file in /path/**/*.so
do
echo mv "$file" "${file/%.so}.dylib"
done
Что неверно, это то, что
echo {} | sed s/.so/.dylib/
выполняется только один раз, до того, как запущен find
sed
{}
на его входе {}
{}
{}
на его входе, который не совпадает /.so/
и остается без изменений, поэтому ваша полученная командная строка
find . -name "*.so" -exec mv {} {}