Из вашей информации кажется, что все в порядке: никаких ошибок. Но дисплей Х может быть на tty8, а не на tty7. Поэтому переключитесь на tty8 с помощью Ctrl-Alt-F8.
EDIT: Это известная проблема: https://bugs.freedesktop.org/show_bug.cgi?id=29920
Пример ошибки, когда экран черный, в то время как startx
работает (это может быть связано или дать некоторые идеи): https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=744152
Я пока не знаю, в чем проблема, но у меня есть несколько замечаний о вашем сценарии.
Старайтесь не вызывать двоичные файлы (с одним фрагментом данных) в цикле. Это убивает производительность.
Вы должны вызвать весь сценарий с sudo, но не sudo в скрипте.
Для изменения имен файлов не требуется sed
. bash
может сделать это самостоятельно:
if [[ $dir =~ "Season 0" ]]; then
new="${dir/Season 0/Sn}"
else
new="${dir/Season /Sn}"
fi
Или без , если
:
new="${dir/Season /Sn}"
new="${new/Sn0/Sn}"
Массив не нужен:
find ... | while read dirpath; do
Это имеет то «преимущество», что места в имени каталога не нарушают определение массива. Я понятия не имею, почему ваш массив = "$ (найти... -print) "
работает. Он не должен (потому что оболочка не должна иметь разницы в разделении слов между космосом и новой строкой).
Проблема заключается в том, что создается не массив, а последовательность. Вы можете легко проверить это, попытавшись напечатать первый элемент массива:
$ array="$(find . -maxdepth 2 -type d -iname 'Season*' -print)";
$ echo $array
./Season 3 ./Season 1 ./Season 2
Выглядит правильно? Но если бы это был массив, можно было бы напечатать каждый элемент отдельно. К сожалению, вышесказанное является простым рядом 1 , а не массивом:
$ echo ${array[0]}
./Season 3 ./Season 1 ./Season 2
$ echo ${array[1]}
Массив фактически состоит из одного ряда, из-за чего второй элемент «массива» ( $ {array [1]}
) пуст. В любом случае массив для этого не нужен, просто прочитайте выходные данные find
(также не нужен -print
, это то, что он делает по умолчанию). Рабочая версия вашего сценария может быть:
#!/usr/bin/env bash
find . -maxdepth 2 -type d -iname 'Season*' | sort -r |
while IFS= read -r dir
do
mv "$dir" ${dir/Season /Sn} && echo Changed "$dir" to "$dir/Season /Sn}";
done
Там используется пара трюков. Сначала выполните цикл while
для просмотра результатов поиска
. Это тот же самый основной принцип, что и для цикла
, который вы использовали, но в сочетании с read
могут считывать из стандартного ввода.
Во избежание разделения на пробелы IFS =
(без него каталог Season 1
будет разделен на Season
и 1
).
В -r
чтения указано, что нельзя использовать обратную косую черту для обхода символов (такие вещи, как \t
и \n
, обрабатываются буквально), что обеспечивает возможность использования даже самых странных имен.
sort -r
необходим для того, чтобы при наличии каталога, соответствующего образцу, в другом соответствующем каталоге нижестоящий элемент был указан перед родительским. Например,
./Season 12/Season 13
./Season 12
Это обеспечивает запуск mv «Season 12» «Sn12»
после running mv «Season 12 »/« Season 13» «Season 12 »/« Sn13»
. Если этого не сделать, вторая команда завершится ошибкой, поскольку Season 12
больше не существует.
Наконец, я удалил sudo
. Вместо этого следует запустить сценарий sudo script.sh
. Никогда не рекомендуется использовать случайные sudo
вызовы в сценариях.
1 Я не уверен в деталях, но, очевидно, bash рассматривает переменные строки как массивы одного элемента.
Просто короткий вариант выше
for dir in ./*/Season\ */
do
mv "$dir" "${dir/eason /n}" && echo "$dir changed to ${dir/eason /n}"
done
работает с сезоном . Если вы захотите переименовать файлы (только на дирижении только), просто удалите /
в конце шаблона, так что это выглядит ./*/ Сезон \ *
Если вам нужно sudo
Я бы предложил вам сделать это в однострочно-командной команде (не скрипт)
for dir in ./*/Season\ */ ; do sudo mv -v "$dir" "${dir/eason /n}" ; done
Я еще не знаю, в чем проблема, но у меня есть несколько замечаний о вашем сценарии.
Старайтесь не вызывать двоичные файлы (с одним куском данных) в цикле. Это убивает производительность.
Вы должны вызвать весь сценарий Sudo, но не Sudo в скрипте.
Вам не нужно SED
для изменения именей файлов. Bash
может сделать это сам:
if [[ $dir =~ "Season 0" ]]; then
new="${dir/Season 0/Sn}"
else
new="${dir/Season /Sn}"
fi
или без , если
:
new="${dir/Season /Sn}"
new="${new/Sn0/Sn}"
Вам не нужен массив:
find ... | while read dirpath; do
это имеет «преимущество», которые пробелы в Название каталога Не нарушает определение массива. Я понятия не имею, почему ваш массив = «$ (находит ... -Print)»
работает. Это не должно (потому что оболочка не должна иметь значение разницы в разделении слов между пространством и новой строкой).