Bash脚本将文件分隔到目录中,在HTML文件中进行反向排序和打印,可以在某些文件上工作,但在其他文件上不工作 目标

Bash脚本将文件分隔到目录中,在HTML文件中进行反向排序和打印,可以在某些文件上工作,但在其他文件上不工作 目标,bash,scripting,Bash,Scripting,根据文件名将文件分离到目录中,运行Bash脚本对其进行反向排序,并将内容组装到一个文件中(我知道实现这一点的步骤已经在堆栈溢出上有了说明,但请继续阅读…) 问题 脚本可以处理除两个文件以外的所有文件 陈述 根目录 根据文件的SQL Server版本或名称将文件分隔到目录中 结果(成功) /dos181-2012: dos-18-1-18165-03-for-sql-server-2012---15-june-2018.html dos-18-1-18176-03-for-sql-server-2

根据文件名将文件分离到目录中,运行Bash脚本对其进行反向排序,并将内容组装到一个文件中(我知道实现这一点的步骤已经在堆栈溢出上有了说明,但请继续阅读…)

问题 脚本可以处理除两个文件以外的所有文件

陈述 根目录 根据文件的SQL Server版本或名称将文件分隔到目录中 结果(成功)

/dos181-2012:

dos-18-1-18165-03-for-sql-server-2012---15-june-2018.html
dos-18-1-18176-03-for-sql-server-2012---10-july-2018.html
dos-18-1-18197-01-for-sql-server-2012---23-july-2018.html
dos-18-1-18232-01-for-sql-server-2012---21-august-2018.html
dos-18-1-18240-01-for-sql-server-2012---5-september-2018.html
/dos181-2016:

dos-18-1-18165-03-for-sql-server-2016---15-june-2018.html
dos-18-1-18197-01-for-sql-server-2016---23-july-2018.html
dos-18-1-18232-01-for-sql-server-2016---21-august-2018.html
dos-18-1-18240-01-for-sql-server-2016---5-september-2018.html
/dos-18-2-已知问题

dos-18-2-known-issues.html
file="dos-18-2-known-issues"
export
/dos-18-2-发行说明

dos-18-2-release-notes.html
变量(均遵循此模式) dos181-2012.sh

file="dos181-2012"
export
dos-18-2-已知问题

dos-18-2-known-issues.html
file="dos-18-2-known-issues"
export
反向排序和组装(假设存在/$file;在测试了所有代码行之后,我认为这就是问题所在): 结果(成功与失败)

  • dos181-2012.html
    的内容顺序正确
  • dos-18-2-known-issues.html
    为空
我试过的 我试图忽略命令中的两个文件:

cat$(ls“$file”/*-i(grep“*known.”)| sort-r)>“$file”/“$file.html

结果:相反的情况发生

  • dos181-2012.html
    为空
  • dos-18-2-known-issues.html
    不是空的
非常感谢。
我完全困惑不解。为什么这些脚本对某些文件有效,而对其他文件无效?(如果有帮助的话,我可以分享更多关于文件内容的信息,但文件内容几乎相同。)感谢您的见解。

首先,您的问题很不完整。您的开始很好,显示了输入文件和目录。但随后您讨论了变量和$file,但没有显示这些变量和$file的源代码。因此,我的回答基于第一段中的解释和我从问题的其余部分推断的结果

我这样做:

#!/bin/bash

cp /etc/hosts dos-18-1-18165-03-for-sql-server-2012---15-june-2018.html
cp /etc/hosts dos-18-1-18165-03-for-sql-server-2016---15-june-2018.html
cp /etc/hosts dos-18-1-18176-03-for-sql-server-2012---10-july-2018.html
cp /etc/hosts dos-18-1-18197-01-for-sql-server-2012---23-july-2018.html
cp /etc/hosts dos-18-1-18197-01-for-sql-server-2016---23-july-2018.html
cp /etc/hosts dos-18-1-18232-01-for-sql-server-2012---21-august-2018.html
cp /etc/hosts dos-18-1-18232-01-for-sql-server-2016---21-august-2018.html
cp /etc/hosts dos-18-1-18240-01-for-sql-server-2012---5-september-2018.html
cp /etc/hosts dos-18-1-18240-01-for-sql-server-2016---5-september-2018.html
cp /etc/hosts dos-18-2-release-notes.html
cp /etc/hosts dos-18-2-known-issues.html

DIRS='dos181-2012 dos181-2016 dos-18-2-release-notes dos-18-2-known-issues'

for DIR in $DIRS
do
    if [ ! -d $DIR ]
    then
        mkdir $DIR
    fi
done

cp dos-18-1*2012* dos181-2012
cp dos-18-1*2016* dos181-2016
cp *notes* dos-18-2-release-notes
cp *known* dos-18-2-known-issues

for DIR in $DIRS
do
    /bin/ls -c1r $DIR >$DIR.html
done
  • cp
    命令仅用于创建包含某些内容的文件
  • 您没有指定目录名是如何生成的,所以我使用了easy选项,并将它们列在一个变量($DIRS)中。这些可以基于文件名构建,但您没有提到这一点
  • 然后创建目录(首先为创建
  • 然后是4个
    cp
    命令。您的代码非常复杂,因为它非常基本
    cp
    ,比如
    rm;mv;ls
    可以进行通配符扩展,因此不需要复杂的
    grep
    xargs
    来复制文件
  • 最后,在最后一个
    for
    循环中,在1列(
    -c1
    ,严格的输出格式)中列出文件(
    ls
    ),颠倒排序顺序(
    -r
    )。该
    ls
    的结果被发送到与目录同名的“.html”文件

  • 首先,你的问题很不完整。您的开始很好,显示了输入文件和目录。但随后您讨论了变量和$file,但没有显示这些变量和$file的源代码。因此,我的回答基于第一段中的解释和我从问题的其余部分推断的结果

    我这样做:

    #!/bin/bash
    
    cp /etc/hosts dos-18-1-18165-03-for-sql-server-2012---15-june-2018.html
    cp /etc/hosts dos-18-1-18165-03-for-sql-server-2016---15-june-2018.html
    cp /etc/hosts dos-18-1-18176-03-for-sql-server-2012---10-july-2018.html
    cp /etc/hosts dos-18-1-18197-01-for-sql-server-2012---23-july-2018.html
    cp /etc/hosts dos-18-1-18197-01-for-sql-server-2016---23-july-2018.html
    cp /etc/hosts dos-18-1-18232-01-for-sql-server-2012---21-august-2018.html
    cp /etc/hosts dos-18-1-18232-01-for-sql-server-2016---21-august-2018.html
    cp /etc/hosts dos-18-1-18240-01-for-sql-server-2012---5-september-2018.html
    cp /etc/hosts dos-18-1-18240-01-for-sql-server-2016---5-september-2018.html
    cp /etc/hosts dos-18-2-release-notes.html
    cp /etc/hosts dos-18-2-known-issues.html
    
    DIRS='dos181-2012 dos181-2016 dos-18-2-release-notes dos-18-2-known-issues'
    
    for DIR in $DIRS
    do
        if [ ! -d $DIR ]
        then
            mkdir $DIR
        fi
    done
    
    cp dos-18-1*2012* dos181-2012
    cp dos-18-1*2016* dos181-2016
    cp *notes* dos-18-2-release-notes
    cp *known* dos-18-2-known-issues
    
    for DIR in $DIRS
    do
        /bin/ls -c1r $DIR >$DIR.html
    done
    
    • cp
      命令仅用于创建包含某些内容的文件
    • 您没有指定目录名是如何生成的,所以我使用了easy选项,并将它们列在一个变量($DIRS)中。这些可以基于文件名构建,但您没有提到这一点
    • 然后创建目录(首先为创建
    • 然后是4个
      cp
      命令。您的代码非常复杂,因为它非常基本
      cp
      ,比如
      rm;mv;ls
      可以进行通配符扩展,因此不需要复杂的
      grep
      xargs
      来复制文件
    • 最后,在最后一个
      for
      循环中,在1列(
      -c1
      ,严格的输出格式)中列出文件(
      ls
      ),颠倒排序顺序(
      -r
      )。该
      ls
      的结果被发送到与目录同名的“.html”文件

    在反向排序和组装过程中,您正在覆盖现有的
    dos-18-2-known-issues.html
    文件。尝试更改文件名以汇编文件。在反向排序和汇编过程中,您将覆盖到现有的
    dos-18-2-known-issues.html
    文件。尝试更改文件名以汇编文件。您的推断是正确的。您的方法解决了我的问题,作为奖励,大大减少了我的代码行。非常感谢。同时也感谢你提供了写更好问题的建议。你的推论是正确的。您的方法解决了我的问题,作为奖励,大大减少了我的代码行。非常感谢。同时也感谢你提供了写更好问题的技巧。