Bash 从文件中移动包含部分行的文件
我有一个文件,每行都有一个数字字符串,比如Bash 从文件中移动包含部分行的文件,bash,unix,xargs,Bash,Unix,Xargs,我有一个文件,每行都有一个数字字符串,比如 1234 2345 ... 我需要将名称中包含该数字,后跟其他内容的文件移动到一个目录中 1234_hello_other_stuff_2334.pdf 2345_more_stuff_3343.pdf 我尝试使用xargs来实现这一点,但我的bash脚本不是最好的。有人能分享正确的命令来完成我想做的事情吗 for i in `cat numbers.txt`; do mv ${i}_* examples done 或者(看,没有cat!
1234
2345
...
我需要将名称中包含该数字,后跟其他内容的文件移动到一个目录中
1234_hello_other_stuff_2334.pdf
2345_more_stuff_3343.pdf
我尝试使用xargs来实现这一点,但我的bash脚本不是最好的。有人能分享正确的命令来完成我想做的事情吗
for i in `cat numbers.txt`; do
mv ${i}_* examples
done
或者(看,没有cat
!)
阅读时;做
mv${i}\ux示例
完成
您可以使用for循环,但这可能会造成很长的命令行。如果在numbers.txt中有20000行,可能会达到shell限制。相反,您可以使用管道:
cat numbers.txt | while read number; do
mv ${number}_*.pdf /path/to/examples/
done
或:
您可以关闭|sh
进行测试。如果文件中还有其他行,并且您只希望匹配4位数字的行,则可以限制匹配:
sed -r '/^[0-9]{4}$/s//mv -v &_*.pdf/' numbers.txt | sh
%
是您的号码(-n1
表示一次一个,'%*.pdf'
到查找
表示它将匹配名称以该号码开头的所有文件;然后它只是复制到/path/to
({}
是实际的文件名)。我本来打算使用sed
,但这要优雅得多。非常好,尽管您可能需要-b
标志,以防mv
进行一些覆盖。
sed 's/.*/mv -v &_*.pdf/' numbers.txt | sh
sed -r '/^[0-9]{4}$/s//mv -v &_*.pdf/' numbers.txt | sh
cat numbers.txt | xargs -n1 -I % find . -name '%*.pdf' -exec mv {} /path/to \;