所以我有一个包含大约 200 个以下类型文件的目录:
gre_6_c1_d34567.h3
gre_6_c1_d95543.h3
gre_6_c1_d42354.h3
gre_6_c1_d01452.h3
gre_6_c1_d23168.h3
gre_6_c1_435435.h3
这些文件之间的唯一区别是 后面的数字d
。我有一个文本文件,其中仅包含d
大约 50 个这样的文件的编号。如果我可以获得整个文件名,但这个文本文件是另一个脚本的输出。有没有办法使用d
文本文件中的编号将这些文件移动到另一个目录?
答案1
使用 sed
e
标志:
sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|e' list.txt
上面将移动文件以newdir/
进行相应的更改。
我假设 list.txt 上的数字如下所示,并用新行分隔:
d34567
d23168
运行此命令来确认:
sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|' list.txt
答案2
使用bash
4,您可以加载一个数组,其中的文件名源自“驱动程序”文件中的数字,然后使用-t
GNU 的选项mv
将它们一次性移动到一个目录中。笔记
#read contents of driver_file into an array arr using mapfile
mapfile -t arr <driver_file
#define prefix and suffix variables
prefix=gre_6_c1_d
suffix=.h3
#prefix each array element
arr=("${arr[@]/#/$prefix}")
#suffix each array element
arr=("${arr[@]/%/$suffix}")
#use GNU mv's -t facility to move files into newdir
mv -t newdir/ "${arr[@]}"
答案3
从文件中一一读取数字并进行移动(假设使用 POSIX shell):
while read -r number; do
name="gre_6_c1_d$number.h3"
[ -f "$name" ] && mv -i "gre_6_c1_d$number.h3" /other/directory
done <number.list
这还确保在将当前目录移动到其他目录之前,该数字会生成当前目录中存在的文件的名称。该mv -i
命令还将在覆盖现有文件之前要求确认。
由于这个问题被标记为参数,我们可以要求xargs
为我们生成数字列表:
xargs sh -c '
for number do
name="gre_6_c1_d$number.h3"
[ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
done' sh <number.list
这不会加快任何速度,但是如果您xargs
提供了一个-P
并行运行的标志,您可以获得一个小的速度提升:
xargs -P 5 -n 10 -h sh -c '
for number do
name="gre_6_c1_d$number.h3"
[ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
done' sh <number.list
这将并行启动最多五个循环副本,并批量给每个副本最多十个数字。