首先,我不是最高级的脚本编写者。我被要求创建一个脚本,该脚本将在目录中搜索超过 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" \;