如何从文本文件列表中移动或复制特定文件

如何从文本文件列表中移动或复制特定文件

所以我有一个包含大约 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

使用bash4,您可以加载一个数组,其中的文件名源自“驱动程序”文件中的数字,然后使用-tGNU 的选项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

这将并行启动最多五个循环副本,并批量给每个副本最多十个数字。

相关内容