在 Linux 中将每个文件移动到其父目录中

在 Linux 中将每个文件移动到其父目录中

问题

假设我有

dir 1/dir 2/file 1
dir 3/dir 4/file 2

(目录和文件名中的空格是故意的)

我希望最终

dir 1/file 1
dir 3/file 2

相关但不完整的答案

这个答案将所有文件移动到当前父目录(而不是每个文件的父目录)

find . -maxdepth 1 -exec mv {} .. \;

这个答案打印出每个父目录,但我不确定如何移动。

find . -name '.user.log' | xargs -I{} dirname {}

答案1

find -type f -execdir mv "{}" ../ \;

类似于-execdir-exec但是在特定文件所在的目录中完成其工作,因此该../部分可以按您需要工作。

为了摆脱空dir2dir4在您的示例中,您需要另一个专门的命令,但主要任务已经完成。

答案2

for x in */* ; do [ -d $x ] && ( echo cd $x ; echo pwd ; echo mv * .. ; echo cd ../.. ) ; done

喜欢所看到的内容吗?然后删除该词echo(从多个位置)

可能并非在所有情况下都有效,例如,如果使用了符号链接。使用 OpenBSD ksh 测试(初步结果在手动目视检查中看起来不错——我没有删除echo命令)。

请注意,[是一个命令;它与共享相同的手册页test(尽管它是 shell 的内部命令,因此您需要使用 shell 的手册页并搜索有关该命令的文档。)

答案3

你开始得正确。但是你可以结合谓词稍微扩展一下,-type只获取文件。使用和你拥有xargs的丰富能力bash

find . -maxdepth 3 -mindepth 3 -type f |xargs -n1 bash -c 'cd $(dirname $0) ; mv $0 ..'

$0是 xargs 传递的位置参数bash。要实时观察,可以使用as-t选项xargs-tn1

-mindepth $D注意:我使用和限制了搜索的深度-maxdepth $D,请根据您的要求随意更改。

注2:Kamil 的回答(使用-execdir实际上是一种更好的解决方案)。

相关内容