尝试从bash的括号()中找到的文件中提取字符串-命令替换。我正在使用此命令
strings $(locate '.tps' |egrep -i customer | egrep -i billing)
它对于没有空格的文件可以正常工作。当文件中有空格时,就会发生这种情况
strings: '/sales/rep/company/October': No such file
strings: 'bill': No such file
strings: 'and': No such file
strings: 'invoice': No such file
strings: 'customer': No such file
strings: 'name.tps': No such file
如果我尝试将命令用双引号引起来
strings "$(locate '.tps' |egrep -i customer | egrep -i billing)"
它将找到的所有文件串联为一个BIG文件名
答案 0 :(得分:2)
使用GNU工具在bash中执行此操作可能类似于:
locate '.tps' | egrep -i customer | egrep -i billing | xargs -d $'\n' strings --
...或:
locate '.tps' | egrep -i customer | egrep -i billing | while IFS= read -r file; do
strings "$file"
done
也就是说,使用换行符分隔的流来表示文件名列表 并不安全,因为允许通用UNIX文件系统(包括ext3,ext4,btrfs等)上的文件包含换行符本身。使用GNU定位:
locate -0 '*.tps' | egrep -i --null-data '(customer.*billing|billing.*customer)' | xargs -0 strings --