将名称中带有字符串的文件从一个文件夹复制到另一个文件夹

将名称中带有字符串的文件从一个文件夹复制到另一个文件夹

我在目录中有一些文件,如下所示。

source_dir: 
ABCD.HRA.0014.2.200.png
ABCD.HRA.0015.2.200.png
ABCD.HRA.0016.2.200.png
MMNP.HRA.0016.2.200.png

我还有一个包含以下内容的文本文件。

text.txt:

ABCD.HRA.0014
ABCD.HRA.0015

现在有什么方法可以按照中提到的字符串传输文件text.txt。之后commandsource dirdest_dir应该如下所示。

source_dir: 
ABCD.HRA.0016.2.200.png
MMNP.HRA.0016.2.200.png

dest_dir: 

ABCD.HRA.0014.2.200.png
ABCD.HRA.0015.2.200.png

答案1

grep -f允许您使用 text.txt 作为模式的源。

#!/bin/bash  
for i in source_dir/*.png; do  
  if grep -Fq -f text.txt <<< "$i"; then  
    mv -t dest_dir "$i"  
  fi  
done  
$ ls
dest_dir  script.sh  source_dir  text.txt

grep 选项:

  • -F将模式解释为固定字符串,而不是正则表达式。
  • -q不要向标准输出写入任何内容。
  • -f从 FILE 中获取模式,每行一个。

这里的字符串:

  • <<<此处文档的变体在发送字符串之前进行变量扩展。

mv 选项:

  • -t将所有源参数移动到-t目录中。

答案2

您的文件似乎都以 结尾.2.200.png,因此我们只能使用输入文件:

while read line ; do
  mv "source_dir/${line}.2.200.png" destination_dir/
done < text.txt

答案3

一种方法是,如果您知道文件中的所有文件名都不包含空格,如下所示:

cp $(cat text.txt) targetdir/

我总是在最后添加/- 如果 targetdir 不存在并且是一个目录,这会使命令失败;你希望发生这种情况,因为否则你最终可能会将所有文件复制到一个名为targetdir(实际上,我认为在现代不会再发生这种情况bash;我已经那么老了)

如果文件中的每一行都包含一个文件名,其中可能包含空格,则此方法有效,至少在ksh及更新版本中如此bash

cat text.txt | while read l
do
cp "$l" targetdir/
done

如果这在您的版本中不起作用bash,那么可以这样做(请注意< text.txt之后的done):

while read l
do
cp "$l" targetdir/
done < text.txt

答案4

使用 find 的另一种方法:

find source_dir -type f | while read file; do  name=$(basename $file); grep ${name%.2.200.png} text.txt && mv -v $file dest_dir; done 

source_dir在列表中查找文件并循环。

对于运行grep中的每个文件text.txt。需要使用basename命令获取文件名以排除source_dir文件夹。

最后,如果grep返回 true,则移动文件dest_dir

添加-vmv命令并删除-q到 grep 命令,您可以看到操作。


以下是如何使用它的示例:

$ ls source_dir
ABCD.HRA.0014.2.200.png  MMNP.HRA.0016.2.200.png  shrr.2.200.png
ABCD.HRA.0015.2.200.png  sghd.2.200.png
ABCD.HRA.0016.2.200.png  shdj.2.200.png

$ cat text.txt
ABCD.HRA.0014
ABCD.HRA.0015

$ mkdir dest_dir

$ find source_dir -type f | while read file; do name=$(basename $file); grep ${name%.2.200.png} text.txt && mv -v $file dest_dir; done
ABCD.HRA.0014
`source_dir/ABCD.HRA.0014.2.200.png' -> `dest_dir/ABCD.HRA.0014.2.200.png'
ABCD.HRA.0015
`source_dir/ABCD.HRA.0015.2.200.png' -> `dest_dir/ABCD.HRA.0015.2.200.png'

相关内容