Попробуйте:
for dir in ~/Documents/CMDsh/*/
do
countFolder=$((countFolder+1))
dir=${dir%*/}
nameFolder=${dir##*/}
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
echo '------------------------------';
done
Примечания:
Всегда заключайте ссылки на переменные оболочки в двойные -кавычки. В данном случае это означало замену:
zip -r -j -9 ~/osuLazerBeatmap/$nameFolder.zip $dir/*
с
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
Это избавляет от необходимости пытаться экранировать эти три строки кода sed.
Единственным исключением из этого правила является то, что вы явно хотите разбиения слов или расширения имени пути .
Пример может помочь. Рассмотрим простой пример с директорией с одним файлом:
$ ls
Sensation (TV Size)
Давайте создадим переменную оболочки:
$ f='Sensation (TV Size)'
Теперь давайте попробуем использовать переменную оболочки без кавычек:
$ ls $f
ls: cannot access 'Sensation': No such file or directory
ls: cannot access '(TV': No such file or directory
ls: cannot access 'Size)': No such file or directory
Обратите внимание, насколько лучше это работает, когда переменная оболочки заключена в кавычки:
$ ls "$f"
Sensation (TV Size)
При заключении переменной оболочки в кавычки экранирование не требуется.
Оболочка интерпретирует конец строки как конец команды. Таким образом, хотя точки с запятой в конце строки и не мешают, они излишни.
Во-первых, "Debian 4.19" не существует :вы, вероятно, смотрите на систему Debian с ядром Linux версии 4.19 , что означает, что это Debian 10("buster ", выпуск, ставший "старым стабильным" как Debian 11, был выпущен всего около двух недель назад ).
Debian использует systemd
начиная с Debian 8, но они по-прежнему поддерживают некоторую совместимость с SysVinit и возможность замены systemd
другими системами инициализации... хотя я не знаю, насколько практично было бы на самом деле использовать SysVinit в Debian 10, так как многие системные интеграции теперь выигрывают или зависят от systemd
. Но systemd
в Debian 10 (, а также 11 )по-прежнему имеет полный механизм совместимости для сценариев init.d, поэтому этот ответ должен применяться независимо от того, какая система инициализации используется.
Итак, у вас есть диск, содержащий корневой раздел установки Debian 10, например. /dev/sdXN
и вы хотите изменить его, чтобы добавить сценарий init.d до того, как эта система действительно загрузится.
Вы можете смонтировать диск в другой системе:
mount /dev/sdXN /mnt
Затем скопируйте ваш скрипт в каталог /etc/init.d/
новой установки:
cp /some/where/myscript /mnt/etc/init.d/
chmod a+rx /mnt/etc/init.d/myscript
Примечание :Для systemd
совместимости ваш скрипт должен включать блок комментариев в стиле LSB -в начале, чтобы документировать его зависимости и предотвратить systemd
слишком ранний запуск его в начале -вверх процесс. См. эту статью Debian Wiki илиinsserv(8)
справочную страницу для более подробной информации.
По сути, ваш скрипт должен иметь подобный блок комментариев в начале скрипта перед любыми другими не -строками комментариев:
### BEGIN INIT INFO
# Provides: myscript
# Required-Start: $local_fs $syslog $network
# Required-Stop: $local_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start myscript at boot time
# Description: Enable service provided by myscript.
### END INIT INFO
Вы должны настроить строки Required-Start
и Required-Stop
в соответствии с требованиями вашего скрипта.
Как только ваш сценарий будет готов, вы можете chroot
войти в новую установку, чтобы запустить инструментupdate-rc.d
для создания символических ссылок init.d. Но перед фактической командой chroot вы должны смонтировать /proc
,/sys
и /dev
файловые системы, иначе вы мало что сможете сделать:
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o rbind /dev /mnt/dev
chroot /mnt /bin/bash # From this point on, /mnt will be this session's root directory
Теперь ваш сеанс будет выполняться «внутри» среды новой установки, и вы сможете использовать большинство инструментов этой установки так же, как если бы система уже выполняла новую установку. Итак, вы можете использовать команду update-rc.d
:
/usr/sbin/update-rc.d myscript defaults
После этого вы можете отменить chroot и размонтировать корневую файловую систему новой установки, чтобы корректно завершить процедуру:
exit # back to having the real root directory
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt
(Процедура монтирования корневой файловой системы неактивной установки применима для многих ситуаций обслуживания и устранения неполадок, таких как исправление поврежденного загрузчика или изменение утерянного пароля root. В этом конкретном случае, возможно, нет необходимости монтировать /proc
и /sys
в неактивной установке... но я решил показать процедуру chroot в "универсальной" форме, чтобы ее было легче применить к другим ситуации тоже.)