Переименование каталогов с помощью find и mv в macOS

Сначала создайте каталог /mnt/cdrom:

mkdir -p /mnt/cdrom

Затем смонтируйте iso -образ с абсолютным путем к образу , например /home/user/R2018a_glnxa64_dvd1.isoвместо простоR2018a_glnxa64_dvd1.iso:

sudo mount -o loop /home/user/R2018a_glnxa64_dvd1.iso /mnt/cdrom

Если каталог /mnt/cdromсуществует, получите дополнительную информацию о вашем образе iso -:

file R2018a_glnxa64_dvd1.iso

и попробуйте смонтировать с явным типом файловой системы, например:

sudo mount -o loop -t iso9660 /home/user/R2018a_glnxa64_dvd1.iso /mnt/cdrom

Дополнительно прочитайте мой ответ на Askubuntu , возможно, ваш образ имеет загрузочный сектор, затем смонтируйте его с параметром offset, который должен быть рассчитан в первую очередь.

2
23.06.2021, 14:55
3 ответа

Вы столкнулись с одной из причин, по которой рекомендуется(почти )всегда заключать переменные оболочки в кавычки .

В вашем случае, поскольку вы назначаете переменной оболочки fichierимя файла, содержащее пробелы, оболочка будет выполнять разбиение слов, когда вы используете эту переменную «как есть», то есть так же, как $fichier. Это означает, что каталог Job offers etcв качестве аргумента для mvбудет интерпретироваться как попытка переместить три файла Job, offersи etcв целевой каталогJob_offers_etc(1).

Чтобы избежать этой проблемы, заключите ссылку на переменную в двойные -кавычки, как в "$fichier".


(1)Это действительно может быть опасно; в некоторых настройках, если целевой каталог не существует, команда может привести к переименованию трех файлов с одним и тем же именем, эффективно перезаписывая первые два третьим.

4
28.07.2021, 11:22

Из-за комбинации findи sh -cи необходимости заключать переменные в кавычки, может быть проще использовать цикл for.

for file in *\ *
do
  newfile=$(echo "$file" | tr ' ' _)
  mv -i "$file" "$newfile"
done
2
28.07.2021, 11:22

Если у вас уже установлена ​​утилита perl rename, File ::Rename , это несложно. Если у вас его еще нет, вам следует установить его -это делает трудные операции массового -переименования тривиально простыми.

Если у вас установлен Homebrew , вы можете установить его с помощьюbrew install rename(см. переименовать в brew ), в противном случае вы можете установить его с помощью cpan. Опять же, если на вашем Mac не установлен Homebrew, вам следует , это дает вам доступ к тысячам пакетов.

Затем вы можете заменить пробелы символами подчеркивания во всех именах файлов + имена каталогов в текущем каталоге, просто:

rename -n 's/ /_/g' *

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

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

Он также откажется переименовывать файл поверх существующего имени файла, если вы не заставите это сделать с помощью -f.

Вы можете использовать его с find, если хотите, и он понимает NUL -разделенный ввод (, поэтому он работает с любыми именами файлов, даже thoseс переводом строки в них ). например.

find. -maxdepth 1 -iname "* *" -print0 | rename -0 -n 's/ /_/g'
3
28.07.2021, 11:22

Теги

Похожие вопросы