0

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

我的目录是:/data/myowndir/ 并且每个文件都有名称,例如

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

我想通过它们各自的前 7 个字符(文件名)将每个文件移动到该目录内的子目录,例如:

  • CV02_T1_*.REC ---> /data/myowndir/CV02_T1
  • CV02_T1_*.PAR ---> /data/myowndir/CV02_T1(与之前的目录相同)
  • PM03_T1_*.REC ---> /data/myowndir/PM03_T1
  • PV05_T2_*.PAR ---> /data/myowndir/PV05_T2
  • 等等

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

但是,有两个限制。

  1. 该目录还包含扩展名为 .nii 的文件,我不想移动这些文件。
  2. 其次,一些文件的文件包含字符串sT13,我想将其移至单独的目录,例如:

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

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

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


编辑:如果我的问题暗示的过于具体,那么让我先重新措辞以使其更清楚并放弃约束:

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

4

1 回答 1

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 个字母

于 2013-08-19T09:12:07.983 回答