文件名匹配和导出

时间:2017-11-17 10:21:52

标签: regex linux bash grep xargs

我在一个文件夹中有几个文件。我必须使用正则表达式模式匹配文件名。在正则表达式模式中,我有一个单词,它将是一个变量。我希望将与模式匹配的所有文件移动到一个单独的目录,并使用备用文件名替换我进行匹配的字符串。

例如,

我有许多文件,文件名在目录中有单词foo,如

gadgeagfooafsa
fsafsaffooarwf
fasfsfoofsafff

我必须列出这些文件并将其复制到另一个目录中,从中替换foo一词。我已经指定新模式为“kuh”,就像上面的文件应该被复制到新文件夹中

gadgeagkuhafsa
fsafsafkuharwf
fasfskuhfsafff

最后,我可以将不同的命令组合在一起以在一行中执行这些命令吗? :)

我曾尝试过这个命令,但它没有用,不知道副本是否失败。

ls | grep ".*foo[} ].*" | xargs cp -t work/

3 个答案:

答案 0 :(得分:0)

find + bash 解决方案:

find . -type f -name "*foo*" -exec bash -c 'fn=${0##*/}; cp "$0" "new_dest/${fn//foo/kuh}"' {} \;
  • fn=${0##*/} - 解压文件 basename
  • ${fn//foo/kuh} - 用文件名中的foo替换kuh

使用您当前的目标目录名替换/调整new_dest

答案 1 :(得分:0)

我选择/ tmp作为新目的地,并且只使用了两个示例文件

newdest="/tmp"; fp="foo"; np="kuh"; for f in $(find . -type f -name "*$fp*"); do new=$(echo $f| sed  "s/$fp/$np/g"); cp -f $f $newdest/$new ; done

移动并重命名文件

ls /tmp/*kuh*
/tmp/fsafsafkuharwf  /tmp/gadgeagkuhafsa

答案 2 :(得分:0)

如果所有文件都在同一个文件夹中

使用bash

for i in *foo* ;do mv "$i" /tmp/"${i/foo/kuh}";done