Как обрабатывать пробелы в именах путей, когда переменная содержит несколько путей

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

find понадобится, когда будут заданы два базовых пути, например:

 pa="/home/user/folder1 /home/user/folder2" find $pa -name '*xy*' ... 

Это будет искать совпадения как в folder1 и в folder2 .

(Обратите внимание, что это упрощенный пример, я очень хорошо знаю, что в этом специальном случае вы можете использовать модификатор -path с параметром, например folder* который охватывает обе папки. Однако этот вопрос должен охватывать случаи, когда вы не можете работать вокруг проблемы так легко из-за более высокой сложности.)


Теперь представьте, что folder2 содержит пространство посередине. Следующие действия не будут работать:

 pa="/home/user/folder1 /home/user/fol\ der2" find $pa -name '*xy*' ... 

Проблема заключается в том, что \ , который обычно используется для представления пространства в оболочке, но не будет работать, если содержимое переменной заключено в двойные кавычки. Однако, в отличие от одного пути на переменную (где это может сделать трюк), следующее не будет работать:

 pa=/home/user/folder1 /home/user/fol\ der2 find $pa -name '*xy*' ... 

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

и не будет следующий вариант:

 pa=/home/user/folder1 /home/user/fol\ der2 find "$pa" -name '*xy*' ... 

Итак, как можно корректно обрабатывать пробелы в путях, если несколько путей содержатся в одной переменной?

Связанный вопрос: существует ли какой-либо надежный способ определить, является ли пробел разделителем между одним путем и его преемником (внутри одной и той же переменной) или пробелом, принадлежащим одному из путей, содержащихся внутри?

2 Solutions collect form web for “Как обрабатывать пробелы в именах путей, когда переменная содержит несколько путей”

Использовать массивы bash :

 pa=("/home/user/folder1" "/home/user/fol der2") find "${pa[@]}" -name '*xy*' ... 

обсуждение

Обратите внимание, что \ не делает того, что надеется:

 $ pa="/home/user/folder1 /home/user/fol\ der2" $ printf '%s\n' $pa /home/user/folder1 /home/user/fol\ der2 

\ В определении pa становится буквальным символом в строке, а не побегом. Если вам нужен список отдельных строк, используйте массив.

Используйте переменную массива и поместите одно значение пути в каждый элемент массива. Если это действительно невозможно, другим подходом было бы использование чего-то другого, кроме пространства, в качестве разделителя элементов.

 p[0]="hello" p[1]="happy" p[2]="world" echo "p[0]=${p[0]}, p[1]=${p[1]}, p[2]=${p[2]}" for p in "${p[@]}" do echo "p=$p." done 

И т.п.

  • shell для цикла с поиском с именами файлов, содержащими пробелы
  • Заменяйте каждую вкладку ТОЛЬКО в начале каждой строки пробелами
  • Как я могу отредактировать мой скрипт bash для учета пробелов?
  • Rsyncing несколько файлов с пробелами в именах
  • Какой скрипт perl будет использовать scp-каталог с пробелами?
  • Перейдите в каталог, содержащий пробел
  • Zsh preexec - Как обрезать все ведущие отступы от кодового блока?
  • Полоса прокрутки пробелов из файлов
  • Использование файлов, имеющих пробелы в их имени в трубах
  • Interesting Posts

    Как заменить строки, соответствующие нескольким шаблонам в sed?

    создание моего собственного initrd, как заполнить каталог dev

    Ошибка прерывистой трубы при остановке чтения

    Как обновить Firefox до последней версии в openSUSE?

    Как я могу заставить unzip / zip не создавать подкаталог, когда я его извлекаю?

    Как узнать количество сообщений, полученных в очереди сообщений в определенный момент времени

    Что использовать для тестирования брандмауэра (порт открыт или нет)

    Как настроить EXIM4 для отправки сообщений электронной почты?

    Как заставить изменить пароль linux, даже если он аналогичен предыдущему

    Пытаясь пересадить bash в / mnt для chroot, что хочет bash, чтобы работать?

    вызов sigprocmask из bash

    Задание локального libc вызывает глобальный libc?

    Собирать коды выхода из параллельных фоновых процессов (подклассов)

    Как я могу экспортировать данные из графика LibreOffice Writer, например, Calc?

    Какова команда поиска файла jar в определенной папке?

    Linux и Unix - лучшая ОС в мире.