如何将具有特定模式的文件夹中的文件移动到目标文件夹?
我想要移动第四列中以分隔符“-”分隔且名称在[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
之间的命令。在将命令添加到循环之前,您可以使用来检查命令是否与正确的文件匹配。do
done
echo "$FILE"
mv