Bash脚本可将文件分为目录,反向排序并在HTML文件中打印对某些文件有效,而对其他文件则无效

时间:2018-09-12 22:54:54

标签: bash scripting

目标

根据文件名将文件分离到目录中,运行一个Bash脚本,对它们进行反向排序,然后将内容组合为一个文件(我知道实现此目的的步骤已在Stack Overflow中进行了说明,但请继续阅读...)< / p>

问题

除两个文件外,脚本可用于所有文件

状态

根目录

dos-18-1-18165-03-for-sql-server-2012---15-june-2018.html
dos-18-1-18165-03-for-sql-server-2016---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-18197-01-for-sql-server-2016---23-july-2018.html
dos-18-1-18232-01-for-sql-server-2012---21-august-2018.html
dos-18-1-18232-01-for-sql-server-2016---21-august-2018.html
dos-18-1-18240-01-for-sql-server-2012---5-september-2018.html
dos-18-1-18240-01-for-sql-server-2016---5-september-2018.html
dos-18-2-release-notes.html
dos-18-2-known-issues.html

根据文件的SQL Server版本或名称将其分隔到目录中

ls | grep "^dos-18-1.*2012.*" | xargs -i cp {} dos181-2012
ls | grep "^dos-18-1.*2016.*" | xargs -i cp {} dos181-2016
ls | grep ".*notes.*" | xargs -i cp {} dos-18-2-release-notes
ls | grep ".*known.*" | xargs -i cp {} dos-18-2-known-issues

结果(成功)

/ 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-known-issues

dos-18-2-known-issues.html

/ dos-18-2-release-notes

dos-18-2-release-notes.html

变量(均遵循此模式)

dos181-2012.sh

file="dos181-2012"
export

dos-18-2-已知问题

file="dos-18-2-known-issues"
export

反向排序和汇编(假设/ $ file存在;测试所有代码行后,我认为这是问题所在)

cat $( ls "$file"/* | sort -r ) > "$file"/"$file".html

结果(成功和失败)

  • 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不为空

谢谢

我完全困惑。为什么这些脚本只能在某些文件上工作,而不能在其他文件上工作? (如果有帮助,我可以共享有关文件内容的更多信息,但是文件内容几乎相同。)谢谢您的见解。

1 个答案:

答案 0 :(得分:2)

首先,您的问题还不完整。您可以很好地开始,显示输入文件和目录。但是随后您将讨论变量和$ files,但是您不会显示变量和$ files的代码。因此,我的答案基于第一段中的解释以及我从其余问题中得出的结论。

我这样做了:

#!/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)中。这些可以基于文件名构建,但是您没有提及。
  • 然后创建目录(第一个for)。
  • 然后使用4条cp命令。对于如此基本的东西,您的代码非常复杂。 cprm;mv;ls;...一样可以进行通配符扩展,因此不需要复杂的grepxargs来复制文件。
  • 最后,在最后一个for循环中,将文件(ls)列在1列(-c1,严格按照输出格式设置)中,并按相反的顺序排列(-r )。该ls的结果将发送到与目录同名的“ .html”文件。