从文件中移动包含部分行的文件

时间:2012-03-06 16:09:47

标签: bash unix xargs

我有一个文件,每行都是一些数字的字符串,如

1234
2345
...

我需要将名称中包含该数字的文件移动到目录示例

的其他内容
1234_hello_other_stuff_2334.pdf
2345_more_stuff_3343.pdf

我尝试使用xargs来执行此操作,但我的bash脚本编写并不是最好的。任何人都可以分享正确的命令来完成我想做的事吗?

3 个答案:

答案 0 :(得分:4)

for i in `cat numbers.txt`; do
    mv ${i}_* examples
done

或(看马,没有cat!)

while read i; do
    mv ${i}_* examples
done < numbers.txt

答案 1 :(得分:2)

你可以使用for循环,但这可能会产生一个非常长的命令行。如果number.txt中有20000行,则可能会遇到shell限制。相反,你可以使用管道:

cat numbers.txt | while read number; do
  mv ${number}_*.pdf /path/to/examples/
done

或:

sed 's/.*/mv -v &_*.pdf/' numbers.txt | sh

您可以不使用| sh进行测试。如果文件中还有其他行,并且您只想匹配4位数的行,则可以限制匹配:

sed -r '/^[0-9]{4}$/s//mv -v &_*.pdf/' numbers.txt | sh

答案 2 :(得分:2)

cat numbers.txt | xargs -n1 -I % find . -name '%*.pdf' -exec mv {} /path/to \;

%是您的号码(-n1表示一次一个),'%*.pdf'find表示它将匹配名称以该号码开头的所有文件;然后它只复制到/path/to{}是实际的文件名。)