我在目录中有一些文件,如下所示。
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
。之后command
,source dir
和dest_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
。
添加-v
到mv
命令并删除-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'