Вывод массива, содержащего элементы с пробелами в качестве аргумента для другой команды - PullRequest
0 голосов
/ 13 октября 2018

Я пишу небольшой скрипт, который выводит список дубликатов файлов в каталоге, т.е.пары XXX.jpg и XXX (1).jpg.Я хочу использовать выходные данные этого скрипта в качестве аргумента команды, а именно ql (быстрый просмотр), чтобы я мог просматривать все такие изображения (чтобы убедиться, что они действительно являются дублирующимися изображениями или просто именами файлов).Например, я могу сделать `ql ( '", которая позволит мне просмотреть все файлы "XXX (1) .jpg"; но я хочу включить в этот список также оригинальный "XXX.jpg"'files.

Вот мой сценарий:

dups=()
for file in *\(*; do
    dups+=( "${file}" )

    breakdown=( $file )
    dupfile="${breakdown[0]}.jpg"
    if [ -e "$dupfile" ]; then
        dups+=( "$dupfile" )
    fi
done

echo ${dups[@]}

Что касается создания массива требуемых имен файлов, то это работает. Но когда дело доходит до вызова чего-то вроде ql $(./printdups.sh), команда запутывается в именах файлов с пробелами. Она попытается открыть «XXX» в виде файла, а затем «(1) .jpg» в качестве другого файла. Поэтому вопрос в том, как я могу повторить этомассив, так что имена файлов с пробелами распознаются как таковые командой, которой я передаю их?

Я попытался изменить строку 3 на:

dups+=( "'$file'" )

И:

dups+=( "${file/ /\ }" )

Оба безрезультатно.

1 Ответ

0 голосов
/ 13 октября 2018

Вы не можете передавать массивы из одного процесса в другой.Все, что вы делаете, это записывает разделенную пробелами последовательность имен файлов в стандартный вывод, и подстановка команды без кавычек в ql $(./printdups.sh) завершается неудачей по той же причине, по которой вам нужен массив в первую очередь: разделение слов не различает пробелы в именах файлов и пробелах между именами файлов.

Я бы рекомендовал определить функцию , а не сценарий, и чтобы эта функция заполнялаглобальный массив, к которому вы можете обращаться непосредственно после вызова функции.

get_dups () {
  dups=()
  for file in *\(*; do
    dups+=( "$file" )
    read -a breakdown <<< "$file"  # safer way to split the name into parts
    dupfile="${breakdown[0]}.jpg"
    if [ -e "$dupfile" ]; then
      dups+=( "$dupfile" )
    fi
  done
}

get_dups
ql "${dups[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...