Переименуйте файлы с пространством с очень большой структурой каталогов

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

У меня только 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

Другие вопросы по тегам