Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从文件中移动包含部分行的文件_Bash_Unix_Xargs - Fatal编程技术网

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 \;