使用UNIX Shell脚本保留最新文件并将旧文件移动到文件夹

时间:2015-09-21 11:11:46

标签: shell unix

我的文件夹中有很多文件(File Format: ABC_YYYYMMDD.TXT)。

- ABC_20150101.TXT 
- ABC_20150201.TXT 
- ABC_20150301.TXT 
- ABC_20150501.TXT

我需要输出如下。

- ABC_20150101.TXT - Moved to a folder name ARCHV in current path.
- ABC_20150201.TXT - Moved to a folder name ARCHV in current path.
- ABC_20150301.TXT - Moved to a folder name ARCHV in current path.
- ABC_20150501.TXT - Kept in the current path, since it is latest.

这是保存在当前文件夹中的最新文件。但是其他文件将被移动到名为/ARCHV的当前工作目录中的另一个文件夹中。 请让我知道UNIX语句执行任务。 感谢

2 个答案:

答案 0 :(得分:3)

这是一个快速解决方案,它依赖于一些已安装的程序:

$ find -maxdepth 1 -type f -iname 'ABC*.TXT' -printf '%T@|%p\n' | sort -r -n | tail -n +2 | cut -d'|' -f2 | xargs -i mv {} ARCHV
  • find打印带有前缀unix时间戳的文件名
  • sort按时间戳排序
  • tail删除第一个(最近的文件)
  • cut仅获取文件名(删除时间戳)
  • xargs mv移动文件

答案 1 :(得分:1)

快速而肮脏:

ls -1|awk 'p{printf "mv %s /archive\n",$0}{p=$0}'|sh
  • 在包含ABC_....个文件
  • 的目录下测试此行 没有任何排序选项的
  • ls将按名称对列表进行排序。
  • 将结果传递给awk,跳过最后一行(文件)
  • 删除结尾|sh将看到该命令生成的输出。如果一切正常,添加|sh将使这些命令执行
  • 我看到你的示例文件名没有空格。如果它们确实包含空格,请将mv %s更改为mv \"%s\"
  • 我的单行中的目标档案被命名为/archive,您可以将其更改为正确的档案。