Переименуйте несколько файлов в нескольких каталогах на имя каталога плюс 1

Я не думаю, что вы хотите передать одинарные кавычки в gtar. В такой команде, как somecmd 'foo bar' 'files*.log', оболочка обработает кавычки, они говорят ей не обрабатывать специальные символы специально, и передаст somecmd аргументы foo bar и files*.log. Программы Unix получают командную строку не как одну строку, а как несколько строк аргументов, именно оболочка выполняет разбиение командной строки на строки.

Если вы хотите прочитать несколько значений в Bash, вы можете использовать read -a array, а затем передать массив команде.

  -a array  assign the words read to sequential indices of the array
            variable ARRAY, starting at zero

т.е.

read -a filenames
gtar "${filenames[@]}"

Индексирование массива с помощью [@] (в кавычках) раскрывает члены массива как отдельные слова, что вам и нужно.

Кроме того, у вас есть for file in ${GTAR[*]}. Это похоже на обращение к GTAR как к массиву, но это не так, вы просто присвоили ему вывод команды gtar в виде строки. В этом случае ${GTAR[*]} - это то же самое, что $GTAR. Поскольку расширение не заключено в кавычки, строка в этот момент подвергается разбиению на слова, которое по умолчанию разбивается на пробельные символы. Но после этого слова также воспринимаются как глобусы имен файлов и расширяются до подходящих имен файлов.

Пока ваши имена файлов не содержат пробелов или глобальных символов (*?[]), все в порядке. Но в целом, это не то, что вы хотите делать.

Для правильных массивов, вероятно, всегда нужно использовать "${array[@]}" вместо [*].

См: Разделение слов, Почему мой сценарий оболочки подавляется пробелами или другими специальными символами? и Массивы

1
04.03.2016, 04:54
1 ответ

Переименование файлов с помощью башизмов

Конечно, есть другие способы сделать это, но если вы ищете чистое решение Bash, которое не полагается на любых утилитах, кроме самой оболочки, будет работать следующее.

dir="The Dark Tower"
declare -i count=1
for file in "$dir"/*.mov; do
    mv "$file" "${dir}/${dir} ${count}.mov"
    count+=1
done
1
27.01.2020, 23:48

Теги

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