移动与特定模式匹配的文件

移动与特定模式匹配的文件

如何将具有特定模式的文件夹中的文件移动到目标文件夹?

我想要移动第四列中以分隔符“-”分隔且名称在[00-09]范围内的文件。

ls | cut -d "-" -f 4 | grep ^[00-09]

显示这些文件:

UNCID_376947.TCGA-DD-A118-01A-11R-A131-07.110525_UNC12-SN629_0087_BC03HWABXX.7.trimmed.txt
UNCID_377115.TCGA-CC-5263-01A-01R-A131-07.110525_UNC12-SN629_0087_BC03HWABXX.5.trimmed.txt
UNCID_377252.TCGA-DD-A114-11A-12R-A131-07.110525_UNC12-SN629_0087_BC03HWABXX.6.trimmed.txt

答案1

使用 glob 表达式:

mv your_dir/*?-*?-*?-0[0-9]* new_dir/

为了测试它,您可以首先执行ls your_dir/*?-*?-*?-0[0-9]*以确保它与您想要的文件匹配。

该表达式的*?-*?-*?-0[0-9]*意思是:字符+-三次然后0是任意字符。

测试

$ ls
another_dir/  aa-03A-b  aa-b-03A-b  aa-b-c-03A-b  a-b-c-03A-b  a-b-c-23A-b
$ mv *?-*?-*?-0[0-9]* another_dir/
$ ls another_dir/
aa-b-c-03A-b  a-b-c-03A-b

答案2

您可以使用“for 循环”:

for FILE in 'file-list'
do
  echo "$FILE"
  mv "$FILE" /your/destination/
done

解释:

'file-list'应替换为获取要使用的文件列表的方法。例如,$(cat files.txt)如果文件中已有列表,pattern*如果目录中的文件以相同模式开头,或者$(find -iname "*pattern*")如果您想使用 find 来获取列表。
输出将一个接一个地存储在变量中。将对每个元素执行和FILE之间的命令。在将命令添加到循环之前,您可以使用来检查命令是否与正确的文件匹配。dodoneecho "$FILE"mv

相关内容