Создайте символические ссылки на файлы, находящиеся в подпапках с пробелами?

Вопрос или проблема

У меня есть папка, в которой несколько папок с 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/ \;

Пояснение команды:

  1. find /mnt/fs1/Shares/Software$/ISOs/: Начинаем поиск в указанной папке, где хранятся ваши файлы ISO.
  2. -name "*.iso": Указываем, что нас интересуют только файлы с расширением .iso.
  3. -exec ln -sf {}: Для каждого найденного файла выполняем команду ln -sf, где {} заменяется на полный путь найденного файла. Существующая ссылка с тем же именем будет перезаписана.
  4. /mnt/fs2/Shares/Images$/server/template/iso/: Путь, куда будут созданы мягкие ссылки на файлы ISO.
  5. \;: Конец команды -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

Это поможет вам убедиться в корректности результата перед созданием ссылок.

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

Оцените материал
Добавить комментарий

Капча загружается...