根据文件名模式将多个文件移动到多个目录,同时排除一些

时间:2013-08-19 08:43:26

标签: linux loops wildcard move multiple-files

作为Linux noob(想要学习!),我一直在浏览和搜索,但遗憾的是我无法为我的问题找到合适的解决方案。我有一个包含几个文件的目录(很多),我想将它们移到不同的目录(也可以制作)。更具体一点:

我的目录是:/ data / myowndir /,每个文件的名称都是

  
      
  • CV02_T1_ [随机字符] .REC
  •   
  • PM03_T2_ [随机字符] .PAR
  •   

我想将每个文件移动到这个目录中的一个子目录中,它们各自的前7个字符(文件名),这样:

  
      
  • CV02_T1 _ * .REC ---> /数据/ myowndir / CV02_T1
  •   
  • CV02_T1 _ *。PAR ---> / data / myowndir / CV02_T1(与上一个目录相同)
  •   
  • PM03_T1 _ * .REC ---> /数据/ myowndir / PM03_T1
  •   
  • PV05_T2 _ *。PAR ---> /数据/ myowndir / PV05_T2
  •   
  •   

所以我想移动多个文件创建这些多个目录。

但是,有两个限制因素。

  1. 该目录还包含扩展名为.nii的文件,我不想移动
  2. 其次,某些文件的文件名包含字符串 sT13 ,我想将其移至单独的目录,以便:
  3.   

    PM03_T2_ [随机字符] sT13 [随机字符] .PAR ---> /数据/ myowndir / PM03_struc

    (因此只有文件名的前5个字符和附加字符串[struc]添加到新目录名中)

    任何人都知道如何做到这一点?我应该编写脚本还是可以从命令终端执行此操作?我一直在阅读mv,mmv,find,while,for,rsync的类似问题和手册页的其他答案;但我不知道怎么把它放在一起。


    编辑: 如果我的问题是过于具体暗示,那么让我先重新说明它,使其更清晰,并删除约束:

    如何根据文件名的第一部分将多个文件从目录移动到多个子目录?

1 个答案:

答案 0 :(得分:0)

我假设你的文件名开头有两个以上7个字母的序列(因为否则你只能使用带有bash扩展名的mv命令)。在bash上,将“特殊”文件与中间的字母序列一起移动到新目录:

cd  /data/myowndir/
for filename in *sT13*.*; do
   if [ "${filename: -4}" != ".nii" ]; then
      dir_name=${filename:0:5};
      mkdir -p ${dir_name}struc
      mv -i $filename ${dir_name}struc/${filename}
   fi
done

然后将所有其他文件移动到各自的新文件夹:

for filename in *.*; do
   if [ "${filename: -4}" != ".nii" ]; then
      dir_name=${filename:0:7};
      mkdir -p $dir_name
      mv -i $filename $dir_name/${filename}
   fi
done

-p命令的mkdir选项可确保在目录已存在时不会出错。 ${string:0:7}选择字符串的前7个字母