Переименование сценария удара каталога - предназначается для … Никакой такой файл или каталог

Из вашей информации кажется, что все в порядке: никаких ошибок. Но дисплей Х может быть на 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

1
06.01.2019, 23:26
3 ответа

Я пока не знаю, в чем проблема, но у меня есть несколько замечаний о вашем сценарии.

Старайтесь не вызывать двоичные файлы (с одним фрагментом данных) в цикле. Это убивает производительность.

Вы должны вызвать весь сценарий с 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) " работает. Он не должен (потому что оболочка не должна иметь разницы в разделении слов между космосом и новой строкой).

-121--175366-

Проблема заключается в том, что создается не массив, а последовательность. Вы можете легко проверить это, попытавшись напечатать первый элемент массива:

$ 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 рассматривает переменные строки как массивы одного элемента.

2
27.01.2020, 23:37

Просто короткий вариант выше

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
0
27.01.2020, 23:37

Я еще не знаю, в чем проблема, но у меня есть несколько замечаний о вашем сценарии.

Старайтесь не вызывать двоичные файлы (с одним куском данных) в цикле. Это убивает производительность.

Вы должны вызвать весь сценарий 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)» работает. Это не должно (потому что оболочка не должна иметь значение разницы в разделении слов между пространством и новой строкой).

0
27.01.2020, 23:37

Теги

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