Из «Терминала» мне интересно, как я могу преобразовать все «x» в «y» в именах файлов для определенного каталога в Mac OS X? Обратите внимание, что «х» означает что угодно, а «у» - просто пробел.
Я хотел бы сделать это рекурсивно, обрабатывая все подкаталоги, а не только одну папку за раз.
Адаптируя базовую концепцию sed
, на которую ссылается @meatspace в своем комментарии (которая находится на этой странице), и добавив find
в микс, я придумал этот скрипт:
find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f |\
while read FULL_ITEM_PATH
do
FILE_DIRNAME=$(dirname "${FULL_ITEM_PATH}");
FILE_BASENAME=$(basename "${FULL_ITEM_PATH}");
mv "${FILE_DIRNAME}"/"${FILE_BASENAME}" "${FILE_DIRNAME}"/"$(echo $FILE_BASENAME | sed -e 's/_/ /g')";
done
Он будет использовать команду find
чтобы найти все файлы из текущего каталога, в котором вы находитесь, включая дочерние каталоги / файлы, а затем выполнить поиск подчеркиваний в именах файлов (_
) и изменить их на пробелы (
) по желанию. Скрипт игнорирует «точечные файлы» / «невидимые файлы», как .DS_Store
через -prune -o -not -name '.*'
И тогда основная логика действует только на фактическое имя файла, а не на имя каталога, отделяя базовое имя файла от имени каталога.
Я создал тестовое дерево каталогов на своем компьютере Mac OS X 10.9.5 (Mavericks) с файлами, в именах которых есть подчеркивания (_
), а некоторые вложены в дочерний каталог, например так:
./foo_bar
./foo_bar_two
./foo_bar_two_three
./foo_bar_two_three_bleagh.txt
./nested/foo_bar
./nested/foo_bar_two
./nested/foo_bar_two_three
./nested/foo_bar_two_three_bleagh.txt
./nested_foo/foo_bar
./nested_foo/foo_bar_two
./nested_foo/foo_bar_two_three
./nested_foo/foo_bar_two_three_bleagh.txt
Затем я запустил этот скрипт, и все они были автоматически изменены, чтобы использовать пробелы (
) по желанию вот так:
./foo bar
./foo bar two
./foo bar two three
./foo bar two three bleagh.txt
./nested/foo bar
./nested/foo bar two
./nested/foo bar two three
./nested/foo bar two three bleagh.txt
./nested_foo/foo bar
./nested_foo/foo bar two
./nested_foo/foo bar two three
./nested_foo/foo bar two three bleagh.txt
Пока скрипт работает, если вы хотите выполнить простой «пробный запуск», чтобы увидеть, какие файлы будут действовать в сценарии, замените команду mv
чтобы echo
так:
find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f |\
while read FULL_ITEM_PATH
do
FILE_DIRNAME=$(dirname "${FULL_ITEM_PATH}");
FILE_BASENAME=$(basename "${FULL_ITEM_PATH}");
echo "${FILE_DIRNAME}"/"${FILE_BASENAME}" "${FILE_DIRNAME}"/"$(echo $FILE_BASENAME | sed -e 's/_/ /g')";
done
Хорошая вещь об использовании echo
для отладки в том, что вы также можете точно видеть, что происходит в ядре вашего скрипта. Поэтому, хотя я и написал этот сценарий для точного соответствия потребностям, указанным в этом вопросе, не стесняйтесь экспериментировать с ним, чтобы адаптировать его к новым потребностям / идеям, если они появятся.