Вопрос или проблема
У меня есть папка, в которой несколько папок с ISO-образами в каждой. Некоторые имена файлов и папок содержат пробелы. Вот пример структуры папок:
/ISOs
-CentOS
--Centos6
---Centos6_x64.iso
---Centos6_x86.iso
-Windows_10_Pro
--Windows_10_Pro.iso
-Windows 10 Enterprise
--Windows 10 Enterprise.iso
Попробованные команды:
find /mnt/fs1/Shares/Software$/ISOs/ -name \*.iso | xargs ln -sf /mnt/fs2/Shares/Images$/proxmox/template/iso
и
for file in "$(find /mnt/fs1/Shares/Software$/ISOs/ -name \*.iso)"; do ln -sf /mnt/fs2/Shares/Images$/server/template/iso/$file;
При использовании вышеуказанных команд создаются ссылки на файлы, но пропускаются все, что содержит пробелы в имени папки/подпапки или в имени файла:
/iso
-Centos6_x64.iso
-Centos6_x86.iso
-Windows_10_Pro.iso
Какой лучший способ перечислить все файлы, содержащиеся в этой папке?
Когда в строках есть пробелы, оболочка интерпретирует их как отдельные команды. Вам нужно заключить путь в кавычки, чтобы оболочка знала, что это единое целое.
for file in "$(find /mnt/fs1/Shares/Software$/ISOs/ -name \*.iso)"; do ln -sf "/mnt/fs2/Shares/Images$/server/template/iso/$file;"
Я пробовал аналогичную команду в своей системе, и более простой способ сделать это будет следующим:
find /mnt/fs1/Shares/Software$/ISOs/ -name "*.iso" -exec ln -sf {} \;
Ответ или решение
Для создания мягких ссылок на файлы, находящиеся в подпапках с пробелами в именах, можно использовать команду find
, которая обрабатывает такие имена файлов корректно. Проблема, с которой вы столкнулись, заключается в том, что оболочка (shell) интерпретирует пробелы как разделители команд, если пути не заключены в кавычки. Вот как можно решить вашу задачу.
Решение
Вы можете использовать следующую команду, которая использует find
и -exec
для создания мягких ссылок на файлы ISO в указанной директории:
find /mnt/fs1/Shares/Software$/ISOs/ -name "*.iso" -exec ln -sf {} /mnt/fs2/Shares/Images$/server/template/iso/ \;
Пояснение команды:
find /mnt/fs1/Shares/Software$/ISOs/
: Начинаем поиск в указанной папке, где хранятся ваши файлы ISO.-name "*.iso"
: Указываем, что нас интересуют только файлы с расширением .iso.-exec ln -sf {}
: Для каждого найденного файла выполняем командуln -sf
, где{}
заменяется на полный путь найденного файла. Существующая ссылка с тем же именем будет перезаписана./mnt/fs2/Shares/Images$/server/template/iso/
: Путь, куда будут созданы мягкие ссылки на файлы ISO.\;
: Конец команды-exec
.
Примечания
- Убедитесь, что у вас есть необходимые права доступа для записи в директорию назначения.
- Проверьте, существует ли целевая директория (
/mnt/fs2/Shares/Images$/server/template/iso/
). Если её нет, создайте её перед выполнением команды с помощьюmkdir -p /mnt/fs2/Shares/Images$/server/template/iso/
. - Убедитесь, что пути не содержат опечаток и правильно указаны.
Рекомендации
Если вам нужно тестировать команды перед их выполнением, воспользуйтесь командой echo
или добавьте -print
к команде find
, чтобы увидеть, какие файлы будут обработаны:
find /mnt/fs1/Shares/Software$/ISOs/ -name "*.iso" -print
Это поможет вам убедиться в корректности результата перед созданием ссылок.
Таким образом, используя описанный метод, вы сможете корректно создать мягкие ссылки на файлы, даже если они находятся в подпапках с пробелами в именах.