根据文件和文件夹名称的正则表达式匹配将文件复制到文件夹中

杜诺瓦

我遇到的情况是,我有一系列文件,如下所示:

1234_A_data1_v1.ext
1234_A_data1_v2.ext
1234_A_data2_v1.ext
1234_A_data2_v2.ext
1234_B_data1_v1.ext
1234_B_data1_v2.ext
1234_B_data2_v1.ext
1234_B_data2_v2.ext
1234_AA_data1_v1.ext
1234_AA_data1_v2.ext
1234_AA_data2_v1.ext
1234_AA_data2_v2.ext
1234_BB_data1_v1.ext
1234_BB_data1_v2.ext
1234_BB_data2_v1.ext
1234_BB_data2_v2.ext

正则表达式字符串1234_[A-Z]+标识数据集。我想为每个这样的数据集创建文件夹(基于文件名),然后将相应的文件移动到所述文件夹中。例如,将1234_A_data1_v1.ext,1234_A_data1_v2.ext,1234_A_data2_v1.ext,1234_A_data2_v2.ext放在文件夹1234_A下。

我设法如下创建文件夹:

grep -o -E '^[0-9]+_[A-Z]+' seqnames | xargs echo | xargs mkdir

这给了我:

1234_A
1234_A_data1_v1.ext
1234_A_data1_v2.ext
1234_A_data2_v1.ext
1234_A_data2_v2.ext
1234_B
1234_B_data1_v1.ext
1234_B_data1_v2.ext
1234_B_data2_v1.ext
1234_B_data2_v2.ext
1234_AA
1234_AA_data1_v1.ext
1234_AA_data1_v2.ext
1234_AA_data2_v1.ext
1234_AA_data2_v2.ext
1234_BB
1234_BB_data1_v1.ext
1234_BB_data1_v2.ext
1234_BB_data2_v1.ext
1234_BB_data2_v2.ext

一切都很好。但是现在,我不知道如何将文件移动到各自的文件夹中,这让我很失落。

任何有关如何实现此目标的建议将不胜感激。

特别是,有什么方法可以做类似的事情mv *<pattern>*filename *<pattern>*destination吗?我也有兴趣了解是否还有其他简洁的方法(也许合适?)来完成此任务。

rickhg12hs

好吧,如果所有这些文件都遵循您显示的模式并且位于同一目录中,那么这种单线似乎可以正常工作。

$ for d in $( cut -f1-2 -d_ <(ls 1234_*) | sort -u ); do mkdir $d; mv ${d}_* $d; done

此bash命令使用Looping结构 for管道 |进程替换 <(...)命令替换 $(...)

ls 1234_*创建与该模式匹配的所有文件的列表。cut -f1-2 -d_拆分每个匹配的文件名_,然后仅输出前两个字段(包括_这两个字段之间的分隔符)。sort -u首先对这些cut前缀进行排序,然后仅输出唯一项。您要使用这些唯一的前缀作为目录名。for然后遍历这些唯一的前缀,创建目录(mkdir),并将mv匹配前缀的文件复制到该新目录。

谨慎使用并根据需要进行调整。如果此目录中还有其他文件或目录,或者在执行命令时出现错误,则由于将创建目录,因此执行或重新执行命令可能无法执行您想要的操作,因为全局将不匹配您想要什么,等等。

这是一个例子。

$ ls -alF   # Show the files in the directory
total 8
drwxrwxr-x.  2 user user 4096 Jul 19 02:15 ./
drwxrwxr-x. 34 user user 4096 Jul 19 02:02 ../
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_AA_data1_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_AA_data1_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_AA_data2_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_AA_data2_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_A_data1_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_A_data1_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_A_data2_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_A_data2_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_BB_data1_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_BB_data1_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_BB_data2_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_BB_data2_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_B_data1_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_B_data1_v2.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_B_data2_v1.ext
-rw-rw-r--.  1 user user    0 Jul 19 02:07 1234_B_data2_v2.ext
$ for d in $( cut -f1-2 -d_ <(ls 1234_*) | sort -u ); do mkdir $d; mv ${d}_* $d; done  # the one-liner
$ ls -alF  # show the directory now
total 24
drwxrwxr-x.  6 user user 4096 Jul 19 02:17 ./
drwxrwxr-x. 34 user user 4096 Jul 19 02:02 ../
drwxrwxr-x.  2 user user 4096 Jul 19 02:17 1234_A/
drwxrwxr-x.  2 user user 4096 Jul 19 02:17 1234_AA/
drwxrwxr-x.  2 user user 4096 Jul 19 02:17 1234_B/
drwxrwxr-x.  2 user user 4096 Jul 19 02:17 1234_BB/
$ tree .  # show the whole directory tree structure
.
├── 1234_A
│   ├── 1234_A_data1_v1.ext
│   ├── 1234_A_data1_v2.ext
│   ├── 1234_A_data2_v1.ext
│   └── 1234_A_data2_v2.ext
├── 1234_AA
│   ├── 1234_AA_data1_v1.ext
│   ├── 1234_AA_data1_v2.ext
│   ├── 1234_AA_data2_v1.ext
│   └── 1234_AA_data2_v2.ext
├── 1234_B
│   ├── 1234_B_data1_v1.ext
│   ├── 1234_B_data1_v2.ext
│   ├── 1234_B_data2_v1.ext
│   └── 1234_B_data2_v2.ext
└── 1234_BB
    ├── 1234_BB_data1_v1.ext
    ├── 1234_BB_data1_v2.ext
    ├── 1234_BB_data2_v1.ext
    └── 1234_BB_data2_v2.ext

4 directories, 16 files

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在javascript中为文件夹名称创建正则表达式?

“ xargs -a文件”将文件复制到文件夹

正则表达式匹配文件夹和所有子文件夹

将目录更改为名称为正则表达式的文件夹

使用PowerShell根据名称将文件列表复制到文件夹

将文件复制到文件夹和所有子文件夹中

如果文件夹名称与正则表达式匹配,则使用Cmd findstr

将文件从多个文件夹复制到新文件夹-文件具有相同的名称

匹配正则表达式的文件名,但在带通配符的文件夹中

在路径中查找最后一个文件夹名称的正则表达式

正则表达式匹配某些子文件夹,并忽略其子文件夹

正则表达式以匹配文件夹结构中的有效路径

正则表达式以捕获具有相同名称的文件名和文件夹

如何使用Python将子文件夹和文件复制到新文件夹

创建一个批处理文件,该文件将文本文件和文件夹中的文件名进行比较,如果匹配,它将文件复制到另一个文件夹

正则表达式按姓氏的字母顺序将文件分类到文件夹中?

如何编写bash脚本以根据名称将文件复制到新文件夹中?

如何通过带有文件夹名称正则表达式的python打开文件?

如何使用xcopy将子文件夹复制到子文件夹中?

文件夹路径的正则表达式

将一个文件复制到不同名称的文件夹中

根据 OSX 终端中的已知文件夹名称列表将文件夹复制到另一个文件夹

正则表达式 - 如何在动态文件夹名称中查找文件

如何将文件夹中的文件复制到多个文件夹中

正则表达式:从 Y 文件夹中查找 X 扩展名的文件

Windows批量复制根据部分名称将文件夹排序到文件夹中

将文件夹名称连接到文件名并将文件复制到文件夹

如何根据正则表达式模式将文件移动到新文件夹(尚未创建)?

根据唯一标识符将文件夹移动或复制到其他文件夹中