首页 > 解决方案 > Bash 脚本从存储在变量中的列表创建新文件夹

问题描述

我正在尝试编写一个 bash 脚本来创建与我的服务器上的目录具有相同名称和结构的新文件夹。

首先我得到所有目录并按名称对它们进行排序:

   allDirLocal=$(cd $dirLocal ; find -type d |sort)

   allDirServer=$(ssh -t $remoteServer "cd $dirServer ; find -type d |sort")

然后我比较了它们以查找我的本地驱动器上缺少哪些目录:

newDirServer=$(comm -13 <(echo "$allDirLocal") <(echo "$allDirServer"))

然后我尝试在我的本地机器上创建上述目录:

for Dir in "$newDirServer" ; do mkdir $Dir ; done

但是,我最终得到的目录如下所示:

'exampleDir'$'\r' 而不是 exampleDir

我该如何解决?

编辑:我不想从 txt 文件而是从变量创建目录树,但我总是以这种奇怪的格式结束......

编辑:我实际上只需要用 ' ' 替换 "" 来摆脱我目录名称中的那些转义符号......我只花了一个月的时间就弄清楚了:P

标签: bashvarmkdircomm

解决方案


这是您的解决方案:

newDirServer=$(comm -13 <(echo "$allDirLocal") <(echo "$allDirServer") | sed 's@^\./@@g' | sed -r 's@\r@@g' | grep -v '^\.$')

我已经删除了初始 ./ 路径并使用 sed 删除了所有返回字符和 . 为空的文件夹。

完整脚本:

#!/bin/bash
dirLocal="$HOME/etc.../etc...."
dirServer='/etc/etc/etc'
remoteServer='etcetcetc'
allDirLocal=$(cd "$dirLocal"; find -type d | sort)
allDirServer=$(ssh -t "$remoteServer" "cd \"$dirServer\"; find -type d | sort")
newDirServer=$(comm -13 <(echo "$allDirLocal") <(echo "$allDirServer") | sed 's@^\./@@g' | sed -r 's@\r@@g' | grep -v '^\.$')
while read line; do mkdir "$line"; done <<< "$newDirServer"

推荐阅读