需要循环遍历文件夹并将文件移动到不同的目录吗?

需要循环遍历文件夹并将文件移动到不同的目录吗?

我的子目录中有一堆文件,我想将它们移动到不同的目录。

这些目录组织在一个父目录中,如下所示:Apr1995 Apr1996 Aug1995 等...(月份然后年份)

例如 /Files/Apr1995。

文件的格式如下 1995___.info 或 1995___.dat

我想进入每个子目录并将文件移动到不同的目录,其中子目录按年份分隔,然后格式化。像这样的东西:

OtherFiles/1995/info、OtherFiles/1995/dat、OtherFiles/1996/info 等

1995 目录将包含名为 info 和 dat 的子目录

最后我想要这个组织例如:

桌面/文件/Apr1995/1995__.info,

桌面/文件/Apr1995/1995__.dat,

桌面/其他文件/1995/信息,

Desktop/OtherFiles/1995/dat 等

我已经尝试了很多选择,例如几个单衬:

 for d in ./*/ ; do (cd "$d" && mv 1995*.info /1995/info); done

或者

 find ./ -type f -execdir mv 1995*.info /1995/info {} \;

我只是收到 mv 错误,或者它无法识别它们是类似的文件。

shell 脚本也可以提供帮助。

对于看似相对简单的事情,我有点不知所措。任何帮助,将不胜感激。

编辑:希望添加的信息可以有所帮助

答案1

您的第二个命令将起作用,但您没有指定文件名。如果您想移动与1995_.info和/或模式匹配的所有文件1995_.dat

find ./ -type f -name 1995*.info -exec mv {} /1995/info \;

find ./ -type f -name 1995*.dat -exec mv {} /1995/dat \;

如果您想用一个命令执行所有年份的操作:

for y in {1995..1999}; do $(find Years -type f -name $y*.info -exec mv {} '/'$y'/info' \;); done

for y in {1995..1999}; do $(find Years -type f -name $y*.dat -exec mv {} '/'$y'/dat' \;); done

这将遍历每年的目录并找到文件名并将它们移动到每年的目录中。

旁注:我在 CentOS 7.4 中测试并确认了这一点,但根据环境,您可能需要转义,*以便可以在其前面添加反斜杠:\*

答案2

for a in `find ~+ -type f -path '*199[0-9]*' -iname '199[0-9]*.*'`
{
 if [[ $a =~ \.(dat|info)$ ]]
 then
  n=${a##*/}
  n=${n%.*}; x=${a##*.}
  d=RootNewDir/$n/$x
  mkdir -p $d
  mv $a $d/${n}__$x
 fi
}

相关内容