ЗАМЕНА пробелов в файлах и папках стандартными средствами bash
используется андройд устройство с 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 "* *")