KSH 脚本在逐行读取变量时遇到问题

KSH 脚本在逐行读取变量时遇到问题

首先,我不是最高级的脚本编写者。我被要求创建一个脚本,该脚本将在目录中搜索超过 14 天的打印文件并将它们移动到存档目录。有几个目录将具有相应的存档目录。为了测试这一点,我创建了两个文本文件,其中包含源目录和目标目录。当每个文件中只有一个目录路径时,事情进展顺利。但是,当我向每个文件添加另一个目录路径时,脚本将第一个存档文件夹移动到第二个存档文件夹中。

第一行中找到的文件printdirs.txt应移动到第一行中找到的路径archivedirs.txt。然后循环再次运行,第二行路径中找到的文件printdirs.txt应移动到第二行路径中找到的文件,archivedirs.txt依此类推。

该脚本如下所示:

#!/usr/bin/ksh

printlist=/u/lawson/stage/Scripts/printdirs.txt
archivelist=/u/lawson/stage/Scripts/archivedirs.txt

# Checking the archive list and moving files

for i in $(cat $printlist) ; do
    cd $i   
    /usr/bin/find . -mtime +14 -type f -exec mv "{}" $(cat $archivelist) \;

done

以下是文本文件包含的内容:

$ cat printdirs.txt
/u/lawson/law/print/lawson/tim/1
/u/lawson/law/print/dgfinance/monday190/1

$ cat archivedirs.txt
/u/lawson/law/print/archive
/u/lawson/law/print/archive2

如何让脚本循环每个相应的行而不将“archive”文件夹复制到“archive2”文件夹中?

更新:在 terdon 的帮助下更新了脚本。这是添加 echo 命令后的输出:

# ./printarchive2.ksh 
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /lawson/tim/1      /u/lawson/law/print/archive {} +
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /dgfinance/monday190/1     /u/lawson/law/print/archive2 {} +

terdon 希望我使用的脚本是从目录路径中删除“t”。我通过将“t”更改为“n”来测试它。它从我的目录路径中删除了字母“n”。是否有另一种方法来表示 Korn shell 可以读取的制表符字段分隔符,因为显然这在 KSH 中不起作用。

答案1

我会paste在这里使用。这是一个很棒的工具,可用于组合文件:

$ paste printdirs.txt archivedirs.txt 
/u/lawson/law/print/lawson/tim/1    /u/lawson/law/print/archive
/u/lawson/law/print/dgfinance/monday190/1   /u/lawson/law/print/archive2

正如您在上面看到的,它将打印两个文件中的连续行,并用制表符分隔。如果您的目录名称可以包含空格,则制表符分隔非常有用。现在,您可以迭代输出paste来执行您的操作:

#!/usr/bin/ksh

printlist="/u/lawson/stage/Scripts/printdirs.txt"
archivelist="/u/lawson/stage/Scripts/archivedirs.txt"

paste "$printlist" "$archivelist" | while IFS=$'\t' read source dest; do
    /usr/bin/find "$source" -mtime +14 -type f -exec mv -t "$dest" {}  +
done

请注意,我 i) 删除了cd,不需要它,find可以从任何地方在目标上运行; ii) 删除了for i in $(cat foo)通常应该避免的语法,以及 iii) 替换-exec ... \;-exec +更有效的语法(它将尝试并组合mv调用,这就是-t "$dest"需要的原因)。

如果您mv不支持该-t选项,请将find命令改回:

/usr/bin/find "$source" -mtime +14 -type f -exec mv "$source" "$dest" \;

相关内容