
Привет, я хочу удалить все прямые слеши из всех моих файлов, но сделать это рекурсивно для каждого каталога в основном каталоге.
Как мне изменить этот скрипт, который работает не рекурсивно?
for f in "$1"/*; do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -- "$f" "${dir}/${file//[^_-0-9A-Za-z.]}"
done
или лучше я хочу заменить только косую черту в именах файлов, но это для каждой подпапки в основной папке?
приветствие Макс
решение1
В слое BSD косая черта является разделителем пути. Когда вы встречаете имя файла с косой чертой, ядро преобразует косую черту- /
в двоеточие- :
. Таким образом, имя файла в приложении Finder может выглядеть как , foo/bar
но в слое BSD оно выглядит как foo:bar
.
Итак, чтобы пройти по дереву каталогов, используйте find
для поиска файлов с :
в их имени. Затем используйте встроенный скрипт с -execdir
для удаления двоеточий (косых черт в приложении Finder) из имен файлов.
find . -type f -name '*:*' -execdir bash -c ' for file
do
echo mv -- "${file}" "${file//:}"
done' sh {} \;
Это только перечислит mv
команду и операнды. Если вы чувствуете, что вывод даст вам желаемые результаты, то удалите echo
.