我的子目录中有一堆文件,我想将它们移动到不同的目录。
这些目录组织在一个父目录中,如下所示: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
}