如何将“ /”定界符连接到字符串?

时间:2018-12-20 10:24:31

标签: linux bash concatenation

任务:使用定界符将字符串合并为一个数组,其最大宽度为“/"。

元任务:我有一个包含许多文件的文件夹。需要将它们复制到另一个文件夹。 所以我需要获取“文件名”和“文件夹路径”。

出了什么问题:定界符“ /”工作不正确。它与我的琴弦没有融合。如果我尝试使用“ \ /”,则字符串完全消失。

这是怎么回事?

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 :(得分:0)

delim ='\ /'中存在问题。首先,您不需要保护斜线。其次,所有字符都已在单引号之间得到保护。

您的串联存在语法问题。您不得在此处使用括号!它们可用于打开子外壳。我们不需要那样。

要解决“元任务”,应避免使用IFS或阅读。它们使用起来很复杂(例如,通过在进行全局修改时更改IFS,更改echo显示res数组的方式。在进行故障排除时可能会误导您...)我建议您使用更简单的工具,例如:basename等。 / p>

以下脚本可以解决您的meta(学者?)任务:

# 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)

答案 1 :(得分:0)

任务解决方案:

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 \;

这两者之间的区别在于,shell循环将拒绝复制解析为目录的符号链接,而find命令将复制它们。