我在一个目录中有一些类似的文件
00.01.02 0000 some filename 1.pdf
00.01.02 0000 some filename 1.txt
02.03.07 0163 another filename 2.pdf
02.03.07 0163 another filename 2.txt
而且我必须找到包含特定字符串的所有txt文件,然后将该txt文件及其对应的pdf文件移动到另一个目录。
完成这项工作的最佳方法是什么?
我为您提供了3种选择,基本思路是:
grep | xargs mv
grep | parallel mv
find -exec grep -q -exec mv
grep | xargs mv
使用grep
和xargs
:
grep -FlZ "some string" *.txt \
| xargs -0 -I{} sh -c 'echo mv "$1" "${1%.*}.pdf" some/other/directory' xargs-sh {}
grep
:
-F
匹配完整的字符串,而不是模式-l
仅输出匹配的文件名-Z
在文件名之间输出零分隔符(这很重要,因为允许文件名包含换行符,所以您不能依赖换行符作为分隔符)xargs
:
-0
读取零分隔数据grep | parallel mv
随着xargs
您需要调用使用一个子shellsh -c
能够得到相应的PDF格式的文件名。
除了这样做,您还可以使用一些GNU parallel
很酷的功能!
grep -FlZ "some string" *.txt \
| parallel -0 -j1 echo mv {} {.}.pdf some/other/directory
-j1
一次只做一份工作{}
文件名{.}
没有扩展名的文件名find -exec grep -q -exec mv
另一种选择是,使用find
:
find . -maxdepth 1 -name "*.txt" \
-exec grep -Fq "some string" {} \; \
-exec sh -c 'echo mv "$1" "${1%.*}.pdf" some/other/location' find-sh {} \;
-maxdepth 1
不递归grep -q
为了仅获取错误代码而不是文件名,第二个-exec
仅在第一个成功的情况下运行。-exec
基本上与xargs
第一个选项中的相同。find
而是由它来处理。对于每个选项,echo
如果对输出感到满意,请删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句