【问题标题】:Moving multiple files to multiple directories based on filename pattern, while excluding some根据文件名模式将多个文件移动到多个目录,同时排除一些
【发布时间】:2013-08-19 08:43:25
【问题描述】:

作为一个 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. 其次,有些文件的filenames包含字符串sT13,我想将其移至单独的目录,例如:

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

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

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


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

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

【问题讨论】:

  • 过于本地化。这不太可能对未来的访问者有任何帮助。
  • 您能说得更具体些吗? “过于本地化”是什么意思。请注意,英语不是我的母语。
  • 这暗示问题,就目前而言,似乎非常具体,并且该解决方案不太可能帮助任何未来的访问者。
  • 我明白了。我会等着看是否有人会好心地帮助我。即使我被否决了很多。但是,我将编辑我的问题以改进此“本地化问题”以供将来访问者使用

标签: linux loops wildcard move


【解决方案1】:

我假设文件名的开头有两个以上的 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

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

【讨论】:

  • 是的,每个文件有不同的前 7 个字符序列,包括 ST13 的。您的第一行创建了一个目录并将我的所有文件放在该目录中,但是,每个 sT13 文件都应该在它自己的目录中。
  • 我已经注意到并编辑了答案——这符合您的需要吗?
  • 它说: > dirname:额外的操作数 'CM01_' > 尝试 'dirname --help' 获取更多信息。 > mv: 'CM01_T1_WIP_sT13DTFE_.PAR' 后缺少目标文件操作数
  • 你在什么外壳里?
  • 我刚刚进入“终端模拟器”并输入了“bash”,这不是要走的路吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多