Bash脚本从存储在变量中的列表创建新文件夹

Bash脚本从存储在变量中的列表创建新文件夹,bash,var,mkdir,comm,Bash,Var,Mkdir,Comm,我正在尝试编写一个bash脚本,创建与服务器上的目录具有相同名称和结构的新文件夹 首先,我获取了所有目录并按名称对其进行排序: allDirLocal=$(cd $dirLocal ; find -type d |sort) allDirServer=$(ssh -t $remoteServer "cd $dirServer ; find -type d |sort") 然后,我比较了它们,找出本地驱动器上缺少哪些目录: newDirServer=$(comm -13 <(

我正在尝试编写一个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"))
但是,我最终得到的目录如下所示:

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

我该如何解决这个问题

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

编辑:我真的不得不用“”替换“”来去掉目录名中的转义符号。。。我只花了一个月的时间就弄明白了:P

更换这一行

newDirServer=$(comm -13 <(echo "$allDirLocal" | tr -s '\r') <(echo "$allDirServer" | tr -s '\r'))
newDirServer=$(comm-13这是您的解决方案:

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

newDirServer=$(comm-13我猜您的脚本本身包含CRLF行结尾。请检查
od-c script.sh
并使用编辑器或
dos2unix
进行修复。您确定远程服务器上的文件名不包含尾部CRs吗?我不认为SSH会话可以添加它们,尽管可能也会对此进行调查。排序和本地比较实际上没有必要,这会使您的处理变得复杂。只需对每个远程目录名执行
mkdir-p
;已经存在的名称将不会执行操作。问题仍然存在:/并且文件是Unix格式的…删除前导点是毫无意义的(哈哈)删除所有空格会使文件名中包含空格。对。我的答案是正确的。
newDirServer=$(comm -13 <(echo "$allDirLocal") <(echo "$allDirServer") | sed 's@^\./@@g' | sed -r 's@\r@@g' | grep -v '^\.$')
#!/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"