ЗАМЕНА пробелов в файлах и папках стандартными средствами bash

Рейтинг: 0Ответов: 1Опубликовано: 18.02.2023

используется андройд устройство с termux. Такая ситуация, папки и файлы должны быть в оригинальном виде, а на конвертацию надо отправлять.

Самый эффективный алгоритм получается такой:

1.заменить пробелы на спецсимволы 2.выполнить конвертацию 3.заменить спецсимволы обратно на пробелы

в случаях с файлами

замена: find "/storage/emulated/0/Notifications" -type f -name "* *" -exec bash -c 'mv "$0" "${0// /♡}"' {} \;

обратная замена: find "/storage/emulated/0/Notifications" -type f -name "*♡*" -exec bash -c 'mv "$0" "${0//♡/ }"' {} \;

работает, пока папка с пробелами не попадётся.

Найден также такой вариант замены пробелов и в папках и в файлах:

cd "/storage/emulated/0/Notifications" for x in *" "*; do mv -- "$x" "${x// /♡}" done но он отрабатывает только файлы и папки в текущей папке, то есть если в папке /storage/emulated/0/Notifications есть подпапка "поющие трусы" то она переименуется, а вот все файлы и папки которые внутри папки "поющие трусы" уже не переименовываются.

То есть глубина вложения равна единице, а надо минимум пятёрку, а лучше без ограничений

Ответы

▲ 1

Рассмотрите использование цикла вместо exec

while read file; do
#Получаем имя файла из пути
    FileName="${file##*/}"
#Подставляем каталог, убираем в файле пробелы заносим в переменную
    NoSpace="${file%/*}/${FileName// /♡}"
#Переименовываем
    mv "$file" "$NoSpace"
#Тут комманду конвертации или чего-то еще требующего отсутствия пробелов
    ... $NoSpcace
#Возвращаем имя
    mv "$NoSpace" "$file"
done< <(find "/storage/emulated/0/Notifications" -type f -name "* *")