xargs 内的嵌套命令

xargs 内的嵌套命令

我有一个文件夹的文件夹的文件夹的文件。我正在尝试将所有文​​件复制到其父级。以下命令不起作用,因为dirname "{}"在 find 命令之前执行。请问可以做什么呢?

find . -name "*" -type f | xargs -I "{}" cp "{}" `dirname "{}"`

答案1

要将所有文件从当前工作目录下降的目录树移动到每个文件的父目录中,您甚至不需要中断xargsdirnamefind可以为您做到这一点:

$ tree
.
+--- dir1
|   +--- somefile
+--- dir2
|   +--- someotherfile
$ find . -type f -execdir mv "{}" ../ \;
$ tree
.
+--- dir1
+--- dir2
+--- somefile
+--- someotherfile

execdirfor 选项将find在找到每个匹配文件的目录中执行指定的命令。

答案2

除了解决 DopeGhoti 的 XY 问题之外,我还想给出实际问题的答案,因为恕我直言,知道也很好:用另一个 shell 包围 cp 命令。

find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`'

由于这不起作用(因为 cp 命令会尝试将文件复制到它们已经所在的目录中,因此您需要附加一个 /.. ,如下所示:

find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`/..'

相关内容