Переименуйте файлы с пространством с очень большой структурой каталогов
Я уже прочитал и попробовал многие ответы здесь о том, как переименовать файлы с пробелами в структуре вложенных каталогов. Тем не менее, они, кажется, не работают для моей ситуации. Они все сегфо.
У меня только 1 000 000 файлов в структуре каталогов из 32 768 каталогов. Это также на Windows (Server 2008 R2), и я использую MINGW32, предоставляя мне Bash 3.1.
Каталоги находятся в структуре, подобной 00/00/file1 01/00/file2, где каждая "серия" подкаталогов варьируется от 00 до zz. Я считаю, что структура каталогов идет только на 2 уровня, но я могу ошибаться. Генерация файлов из "свойств" проводника Windows занимает около 45 минут.
Я думаю, что опубликованные здесь ответы являются segfaulting, потому что они исчерпывают память или обходят эти каталоги. Это моя последняя попытка перед публикацией здесь:
find . -maxdepth -1 -mindepth 1 -type -d -printf '%p\n' |
while IFS= read -r g; do
find "$g" -depth -name '* *' | while IFS= read -r f ; do
mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)
done
done
Моя последняя попытка пытается войти хотя бы в первый уровень подкаталогов и затем использовать это решение из другого поста на эту тему:
find . -depth -name '* *' | while IFS= read -r f ; do
mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)
done
Вы можете увидеть мою версию, просто ответ другого поста, встроенный во внешний цикл поиска. Тем не менее, это также segfaults. Я думал попробовать это, потому что пробовал вышеупомянутое решение, когда работал один уровень каталога.
1 ответ
Создайте этот сценарий оболочки, например./move.sh:
#!/bin/bash
echo mv "$1" "${1// /_}"
Сделайте это исполняемым.
Бежать:
find . -depth -name '* *' -exec ./move.sh "{}" \;
Если вывод в порядке, удалите echo
от./move.sh