【问题标题】:Bash script creating new folders from a list stored in a variable [duplicate]Bash脚本从存储在变量中的列表创建新文件夹[重复]
【发布时间】:2023-04-07 11:33:01
【问题描述】:

我正在尝试编写一个 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

【问题讨论】:

  • 我猜你的脚本本身包含 CRLF 行尾。检查od -c script.sh 并使用您的编辑器或dos2unix 进行修复
  • 您确定远程服务器上的文件名不包含尾随 CR 吗?我不认为 SSH 会话可以添加它们,但也许也可以调查一下。
  • 排序和本地比较并不是真正需要的,并且会使您的处理复杂化。只需 mkdir -p 在每个远程目录名称上;那些已经存在的将是无操作的。

标签: bash var mkdir comm


【解决方案1】:

替换这一行

newDirServer=$(comm -13 <(echo "$allDirLocal" | tr -s '\r') <(echo "$allDirServer" | tr -s '\r'))

并使用 bash -x script.sh 执行脚本以按照步骤操作

【讨论】:

  • 问题仍然存在:/并且文件是 Unix 格式...
【解决方案2】:

这是您的解决方案:

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"

【讨论】:

  • 删除前导点是没有意义的(哈哈),删除所有空格会破坏带有空格的文件名。
  • 对。我的答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多