根据文件名将文件分离到目录中,运行一个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
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
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
不为空我完全困惑。为什么这些脚本只能在某些文件上工作,而不能在其他文件上工作? (如果有帮助,我可以共享有关文件内容的更多信息,但是文件内容几乎相同。)谢谢您的见解。
答案 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
命令仅用于创建包含某些内容的文件。for
)。cp
命令。对于如此基本的东西,您的代码非常复杂。 cp
像rm;mv;ls;...
一样可以进行通配符扩展,因此不需要复杂的grep
和xargs
来复制文件。for
循环中,将文件(ls
)列在1列(-c1
,严格按照输出格式设置)中,并按相反的顺序排列(-r
)。该ls
的结果将发送到与目录同名的“ .html”文件。