2014-08-30 2 views
1

Я уже прочитал и попробовал много ответов здесь, как переименовать файлы с пробелами во вложенной структуре каталогов. Однако они, похоже, не работают для моей ситуации. Они все segfault.Переименовать файлы с пространством с очень большой структурой каталогов

У меня всего лишь 100 000 файлов в структуре каталогов из 32 768 каталогов. Это также в Windows (Server 2008 R2), и я запускаю MINGW32, давая мне Bash 3.1.

Каталоги находятся в такой структуре, как 00/00/file1 01/00/file2, где каждый подкаталог «серия» изменяется от 00 до zz. Я считаю, что структура каталогов идет только на 2 уровня, но я могу ошибаться. Генерация количества файлов из «свойств» проводника Windows занимает около 45 минут.

Я думаю, что опубликованные ответы здесь являются segfault, потому что у них заканчивается память или идет по этим каталогам. Это моя последняя попытка, прежде чем отправлять сюда:

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 

Где вы может видеть, что моя версия - это просто ответ на другой пост, встроенный во внешний цикл поиска. Однако это также противоречит. Я подумал попробовать это, потому что пытался использовать вышеупомянутое решение, когда работал один уровень каталогов.

+1

две вещи 1), пожалуйста, не включают в себя теги в названии - это то, что теги для и 2) используйте код '{}', вариант форматирования кода. –

+0

попробуйте записать результаты 'find' в файл, затем используйте' split -l', чтобы разбить проблему на более мелкие задачи, а затем перебрать содержимое разделенных файлов. – Victory

+0

Почему BASH и MinGW? Кажется, вы создаете гору из задачи, которая очень проста. Используйте Python или Java или язык _real_, который не имеет проблем с пробелами. –

ответ

3

Создайте этот сценарий оболочки, например. ./move.sh:

#!/bin/bash 

echo mv "$1" "${1// /_}" 

Сделайте его исполнимым.

Пробег:

find . -depth -name '* *' -exec ./move.sh "{}" \; 

Если выход в порядке, удалите echo из ./move.sh

+2

Стоит отметить, что это решение работает значительно быстрее, чем я ожидал. Обычно выполнение чего-либо с этой структурой каталогов занимает 30 часов. Это завершено менее чем в два раза. Я в шоке. –

 Смежные вопросы

  • Нет связанных вопросов^_^