Как заключить разделитель "/" в строку? - PullRequest
0 голосов
/ 20 декабря 2018

Задача: объединить массив строк с разделителем, разделитель - "/".

Метатаска: у меня есть папка со многими файлами.Нужно скопировать их в другую папку.Поэтому мне нужно получить «имя файла» и «путь к папке».

Что не так: разделитель "/" работает неправильно.Это не соединяется с моими строками.Если я пытаюсь использовать "\ /" - строка вообще исчезает.

Что происходит?

loc_path='./test/*'

delim='\/'

for itt in $loc_path; do
    IFS=$delim
    read -ra res <<< "$itt"
    str=''
    for ((i = 1; i \<= ${#res[@]}; i++)); do
        #str=($str${res[$i]}$delim)
        str="$str${res[$i]}$delim"
    done
    echo $str
done

Пожалуйста, дайте два ответа:

  1. как решить задачу-задачу
  2. лучший способ решить метатаску

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Решение задачи:

arr=( string1 string2 string3 )            # array of strings
str=$( IFS='/'; printf '%s' "${arr[*]}" )  # concatenated with / as delimiter

$str будет одной строкой string1/string2/string3.

Решение мета-задачи:

Несколько файлов:

cp path/to/source/folder/* path/to/dest/folder

Обратите внимание, что * соответствует файлу любого типа и что он не соответствует скрытым именам.Для скрытых имен используйте shopt -s dotglob в bash.Это не удастся, если есть тысячи файлов (список аргументов слишком длинный).

Файлы из нескольких или нескольких файлов, только не каталоги:

for pathaname in path/to/source/folder/*; do
    [ ! -type d "$pathame" ] && cp "$pathname" path/to/dest/folder
done

или, с find,

find path/to/source/folder -maxdepth 1 ! -type d -exec cp {} path/to/dest/folder \;

Разница между этими двумя заключается в том, что цикл оболочки откажется копировать символические ссылки, которые разрешаются в каталогах, а команда find скопирует их.

0 голосов
/ 20 декабря 2018

В delim = '\ /' есть проблема.Во-первых, вам не нужно защищать слеш.Во-вторых, все символы уже защищены между простыми кавычками.

Существует синтаксическая проблема с вашей конкатенацией.Вы не должны использовать круглые скобки здесь!Их можно использовать для открытия вложенной оболочки.Нам это не нужно.

Чтобы решить свою «мета-задачу», вам следует избегать использования IFS или чтения.Они сложны в использовании (например, изменяя IFS глобально, как вы делаете, вы изменяете, как echo отображает массив res. Это может ввести вас в заблуждение, пока вы устраняете неполадки ...) Я предлагаю вам использовать более простой инструмент, такой как: basename и т. Д.

Вот несколько сценариев для решения вашей мета-задачи (ученый?):

# one line :-)
cp src/* dst/


# to illustrate basename etc
for file in "$SRC/"*; do
    dest="$DST/$(basename $file)"
    cp "$file" "$dest"
done

# with a change of directory
cd "$SRC"
for file in *; do cp "$file" "$DST/$file"; done
cd -

# Change of directory and a sub shell
(cd "$SRC" ; for file in *; do cp "$file" "$DST/$file"; done)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...