任务:使用定界符将字符串合并为一个数组,其最大宽度为“/"。
元任务:我有一个包含许多文件的文件夹。需要将它们复制到另一个文件夹。 所以我需要获取“文件名”和“文件夹路径”。
出了什么问题:定界符“ /”工作不正确。它与我的琴弦没有融合。如果我尝试使用“ \ /”,则字符串完全消失。
这是怎么回事?
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
请给出两个答案:
答案 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
命令将复制它们。