Bash 在exec中使用find

Bash 在exec中使用find,bash,find,Bash,Find,我想复制find(使用exec cp选项)找到的文件,但我想更改这些文件的名称-例如find-exec cp'{}'test_path/“test_'{}',它应该将find找到的但前缀为'test'的所有文件复制到我的test_path。但这不管用 如果有人能给我一些建议,我会很高兴的 向您致意您应该将整个test\u路径/“test\u”{}放在“ 比如: 查找-exec cp“{}”测试路径/测试路径如果您有Bash 4.0,并且假设您正在查找txt文件 cd /path for file

我想复制find(使用exec cp选项)找到的文件,但我想更改这些文件的名称-例如
find-exec cp'{}'test_path/“test_'{}'
,它应该将find找到的但前缀为'test'的所有文件复制到我的test_path。但这不管用

如果有人能给我一些建议,我会很高兴的


向您致意

您应该将整个
test\u路径/“test\u”{}
放在
比如:


查找-exec cp“{}”测试路径/测试路径

如果您有Bash 4.0,并且假设您正在查找txt文件

cd /path
for file in ./**/*.txt
do
  echo cp "$file" "/test_path/test${file}"
done
使用GNU查找的

find /path -type f -iname "*.txt" | while read -r -d"" FILE
do
    cp "$FILE" "test_${FILE}"
done
或者GNU find+bash的另一个版本

find /path -type f -name "*txt" -printf "cp '%p' '/tmp/test_%f'\n" | bash
或者这个丑陋的如果你没有找到GNU

$ find /path -name '*.txt' -type f -exec basename {} \; | xargs -I file echo cp /path/file /destination/test_file

假设您所在的目录中有要复制的文件,test_path是它的一个子目录。

我会将它分解一下,如下所示

 for line in `find /tmp -type f`; do FULL=$line; name=`echo $line|rev|cut -d / -f -1|rev` ; echo cp $FULL "new/location/test_$name" ;done
这是输出

cp /tmp/gcc.version new/location/test_gcc.version
cp /tmp/gcc.version2 new/location/test_gcc.version2

自然地从最后一部分中删除echo,因此它不仅仅是echo'ng它将要做的事情并且运行cp

这实际上不起作用,因为{}将整个find作为结果,因此您将从/yourfolder/file.txt获得test_path/test_yourfolder/file.txt,但是如果{}是一个完整的路径(通常是
find
),那么它将“test_path/test}”“你想说什么?我假设OP想将每个文件复制到一个test_path dir,无论文件在哪里找到。所以我就这么想了。哈哈哇,我想我们所有回答这个问题的人都应该得到一个徽章,比如“大多数人在同一时间对同一个问题都有相同的答案”,而simular我的主要意思是我们都使用了for循环,并用一个临时变量exec来管理操作,这不是你想要在这里使用的。“-exec”的目的是在每个文件上运行一个命令,以确定它是否应该包含在find的结果列表中,这就是为什么grep是这种用法最常见的示例。hoho!但我投票支持我的simular解决方案,认为它是最灵活的,不需要当前目录,并且可以将cp保存到任意深度/复杂的dest文件夹中!!;)然而,它可能是最慢的,如果你有lotsa core的tho,也许不是!!你知道如何使用它而不必搜索路径吗?@ghostdog74:你忘记了第一个查找版本中的“/test”。@dennis,谢谢。我已经编辑了,但是如果它又错了,请帮我编辑。thks@JosiP,你在用什么操作系统?Solaris?
cp /tmp/gcc.version new/location/test_gcc.version
cp /tmp/gcc.version2 new/location/test_gcc.version2