将grep列表作为参数传递给cp

时间:2014-09-01 09:34:10

标签: bash unix grep cp

假设我想将文件列表复制到另一个目录

-rw-rw----    Sep 1 11:06   File1.txt
-rw-rw----    Sep 1 11:06   File101.txt
-rw-rw----    Sep 3 11:06   File2.txt    
-rw-rw----    Sep 4 11:06   File303.txt  

我想grep所有那里有9月1日的文件

ls -lrt | grep 'Sep 1'

并尝试将其作为参数传递给cp

cp `ls -lrt | grep 'Sep 1'` /directory/
or
cp $(ls -lrt | grep 'Sep 1') /directory/

第二个选项i是非法变量名 你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

不要解析ls的输出:Why you shouldn't parse the output of ls

相反,您可以执行以下操作:

cp *1* /directory/

*1*将匹配包含1的所有内容,并将应用于cp命令,以便将其展开为:

cp File1.txt File2.txt File303.txt File101.txt /directory/

更新

第一个解决方案是执行以下操作:在grep ping修改时间为Sep 1的文件后打印文件名。根据该输出,复制:

cp $(ls -1 | awk '/Sep 1/{print $NF}') /directory/

但这非常脆弱,因为带有空格的文件名不会被复制,而且解析ls的一般事实也是一个坏主意。

相反,如果要移动过去24小时内修改过的文件,可以执行以下操作:

find . -maxdepth 1 -type f -mtime -1 -exec cp {} /directory/ \;
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
       performs the search           copies the matches to the dir

或添加-daystart以匹配"今天创建",而不是过去24小时:find . -maxdepth 1 -type f -daystart -mtime -1 ...