Вопрос или проблема
У меня есть несколько файлов в ~home (в разных подкаталогах) на моей системе Ubuntu 22.04. Я считаю, что большинство имен файлов с пробелами изначально пришли из Windows.
Я нахожу проблемные файлы с помощью следующей команды find
find . -name “* *”
Как можно изменить имена, чтобы в них вместо пробела был _ или какой-то другой символ во всех файлах, в названиях которых сейчас есть пробел?
Например, я хочу изменить
MSC MACHINE FEET ORDER.pdf
на
MSC_MACHINE_FEET_ORDER.pdf
Используя команду find, я определил, что у меня есть около 600 файлов, названия которых нужно изменить, поэтому мне нужен автоматизированный способ их переименования.
Названия файлов с пробелами вызывают проблемы при запуске некоторых скриптов.
Заранее спасибо за вашу помощь.
Вы можете использовать расширение параметров, чтобы заменить пробелы на подчеркивания:
find -name '* *' -exec bash -c 'mv "$1" "${1// /_}"' -- {} \;
${1// /_}
означает “заменить каждый пробел в первом параметре на подчеркивание” (см. Расширение параметров вman bash
).bash -c
выполняет команды из первого необязательного аргумента. Здесь команда — этоmv
, которая заменяет пробелы подчеркиваниями.- Первый аргумент после аргумента команд для
bash -c
сейчас не важен, поэтому я использовал--
. Оставшиеся аргументы устанавливаются как позиционные аргументы для команды. find -exec
выполняет команду для каждого найденного файла.{}
заменяется на имя файла, а финально\;
говоритfind
, где заканчивается команда. Таким образом, find вызываетbash -c
и передает имя файла в качестве первого аргумента, чтобы его можно было переименовать.
Эта сложная инкантация необходима, чтобы сохранить пробелы в первом аргументе для mv
.
Учтите, что изменение имен файлов также может вызвать проблемы — если программа ожидает, что файл будет с данным именем, изменение имени может привести к сбою программы.
Ответ или решение
Изменение имен файлов, содержащих пробелы, на имена с символами подчеркивания, может быть важной задачей для повышения совместимости файловой системы, особенно если первоначальные файлы поступили из операционных систем с другой файловой структурой, таких как Windows. В вашем случае, вы хотите заменить пробелы в именах файлов на символ подчеркивания на Ubuntu 22.04, используя скрипт.
Теория
Проблема пробелов в именах файлов может вызвать проблемы при выполнении скриптов или создании автоматизированных процессов, так как пробелы обрабатываются как разделители аргументов командной строки. Поэтому, заменяя пробелы на символы подчеркивания, вы упрощаете обработку этих файлов в различных скриптах и приложениях.
Пример
Вы можете использовать команду find
совместно с параметрическим расширением в Bash для автоматизации этой задачи. Приведенный ниже пример демонстрирует, как можно заменить пробелы в именах файлов под символы подчеркивания:
find . -name '* *' -exec bash -c 'mv "$1" "${1// /_}"' -- {} \;
Применение
-
Поиск файлов с пробелами: Команда
find . -name '* *'
ищет все файлы и директории, в именах которых присутствуют пробелы, начиная от текущего каталога и глубже. -
Использование параметрического расширения: Внутри команды
bash -c 'mv "$1" "${1// /_}"'
, параметрическое расширение${1// /_}
заменяет каждый пробел в строке на символ подчеркивания. Это достигается благодаря средствам Bash, которые позволяют изменять строковые значения непосредственно с помощью синтаксических конструкций оболочки. -
Использование exec: Утилита
find
со встроенной командой-exec
позволяет выполнить заданную команду для каждого найденного файла по отдельности. В данном случаеbash -c
используется для выполнения команды обратной замены пробелов, где файл сначала копируется с новым именем, а затем старый удаляется.
Обратите внимание, что массовое переименование файлов может привести к отрицательным последствиям, если программы зависят от старых имен файлов. Рекомендуется предварительно сохранить резервные копии важных данных и протестировать операцию на небольшом наборе файлов для убедительности.
Эти шаги помогут вам успешно автоматизировать процесс замены пробелов в именах файлов на символы подчеркивания, сохраняя при этом последовательность ваших рабочих процессов на Ubuntu 22.04.