Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 根据文件名模式将多个文件移动到多个目录,同时排除一些_Linux_Loops_Wildcard_Move - Fatal编程技术网

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

Linux 根据文件名模式将多个文件移动到多个目录,同时排除一些,linux,loops,wildcard,move,Linux,Loops,Wildcard,Move,作为一个LinuxNoob(想学习!),我一直在浏览和搜索,但不幸的是,我没能为我的问题找到正确的解决方案。我有一个包含多个文件(很多)的目录,我想将其移动到不同的目录(也要创建)。更具体地说: 我的目录是:/data/myowndir/,每个文件的名称如下 CV02_T1_[随机字符].REC PM03T2[[随机字符] ] PAR 我希望将每个文件按其各自的前7个字符(文件名)移动到此目录中的子目录,以便: CV02_T1_*.REC-->/data/myowndir/CV02_T

作为一个LinuxNoob(想学习!),我一直在浏览和搜索,但不幸的是,我没能为我的问题找到正确的解决方案。我有一个包含多个文件(很多)的目录,我想将其移动到不同的目录(也要创建)。更具体地说:

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

  • CV02_T1_[随机字符].REC
  • PM03T2[[随机字符] ] PAR
我希望将每个文件按其各自的前7个字符(文件名)移动到此目录中的子目录,以便:

  • CV02_T1_*.REC-->/data/myowndir/CV02_T1
  • CV02YT1**PAR -> /DATAB/MYONDIR/CV02JT1(与以前相同的目录)
  • PM03_T1*.REC-->/data/myowndir/PM03_T1
  • PV05T2> * PAR -> /DATA/MyONDIR/PV05T2
  • 等等
所以我想移动多个文件并创建这些多个目录

然而,有两个禁忌

  • 该目录还包含扩展名为.nii的文件,我不想移动它
  • 其次,有些文件的文件名包含字符串sT13,我想将其移动到一个单独的目录中,例如:
  • PM03T2[[随机字符] ST13[随机字符] PAR->/DAT/MyONDIr/PM03Syp

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

    有人知道怎么做吗?我应该写一个脚本,还是可以从命令终端完成?我一直在阅读mv、mmv、find、while、for、rsync的类似问题的其他答案和手册页;但我不知道如何把它组合起来


    编辑: 如果我的问题像暗示的那样太具体了,那么让我先把它重新解释一下,让它更清楚,并去掉禁忌:


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

    我假设在文件名的开头有两个以上的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:extra operand'CM01'>有关详细信息,请尝试使用“dirname--help”。>mv:CM01\u T1\u WIP\u sT13DTFE\upar.之后缺少目标文件操作数你在哪个shell中?我刚刚去了“终端模拟器”并键入了“bash”,不是这样吗?