Просто чтобы продемонстрировать, как это сделать с find
;
find . -type f -exec bash -c '
for file; do
f=${file#./}
cp "$file" "./${f//\//_}"
done' _ {} +
Расширение шаблона Bash ${f//x/y}
заменяет x
на y
повсюду. Поскольку find
ставит перед каждым найденным файлом префикс пути, в котором он был найден (здесь ./
), мы обрезаем его, чтобы избежать выполнения mv "./file" "._file"
. И поскольку sla sh используется в самом расширении параметра, нам нужно backsla sh sla sh, мы хотим, чтобы оболочка интерпретировалась буквально. Наконец, поскольку этот синтаксис расширения параметров является Bash -только расширением, мы используем bash
вместо sh
.
Очевидно, что если вы хотите переименовать, а не скопировать, замените cp
на mv
.
Если ваш find
не поддерживает -exec ... +
, это необходимо несколько изменить (возможно, для использования xargs
); но это должно поддерживаться на любой достаточно современной платформе.