Привет я хочу удалить все косые черты из всех моих файлов, но сделать это рекурсивно для каждого каталога в главном каталоге.

Как мне изменить этот скрипт, который работает не рекурсивно?

for f in "$1"/*; do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -- "$f" "${dir}/${file//[^_-0-9A-Za-z.]}"
done

или лучше я хочу заменить только косую черту в именах файлов, но это для каждой подпапки в основной папке?

приветствие Макс

1 ответ1

0

На уровне BSD косая черта является разделителем пути. Когда вы встречаете имя файла с косой чертой, ядро переводит косую черту / в двоеточие : Таким образом, имя файла в приложении поиска может выглядеть как foo/bar но на уровне BSD оно выглядит как foo:bar .

Итак, для обхода дерева каталогов используйте find для поиска файлов с : в их имени. Затем используйте встроенный сценарий с -execdir чтобы удалить двоеточия (косые черты в приложении поиска) из имен файлов.

find . -type f -name '*:*' -execdir bash -c ' for file
    do
        echo mv -- "${file}" "${file//:}"
    done' sh {} \;

Это только перечислит команду mv и операнды. Если вы чувствуете, что результат даст вам желаемые результаты, то удалите echo .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .