如何移动目录(以及所有子文件/目录)但按字母顺序移动项目?

如何移动目录(以及所有子文件/目录)但按字母顺序移动项目?

当我运行以下命令时:

mv -v foo /mnt/bar

该目录foo及其所有子内容都将移至该目录中/mnt/bar。文件移动的顺序似乎是目录命令 (ls -U)。

有没有一种好方法可以执行相同的操作,但确保子文件/目录foo按字母顺序移动?

我意识到我可以用来find -exec mv按字母顺序迭代子内容,但这需要一些烦人的体操来维护目标中相同的子目录结构。我希望 GNU 上有一个标志mv,但手册页没有显示任何有用的内容。

答案1

$ \ls foo | xargs -I% mv -v foo/% bar
'foo/one' -> 'bar/one'
'foo/sie' -> 'bar/sie'
'foo/two' -> 'bar/two'
'foo/uve' -> 'bar/uve'
'foo/wox' -> 'bar/wox'
'foo/zanzibar' -> 'bar/zanzibar' 
  1. 用于ls按字母顺序列出项目。为了确保您运行的是纯粹的ls(没有由隐藏在 .bashrc 或 .bash_aliases 中的别名添加的额外字符),请以 .bashrc 或 .bash_aliases 的形式运行命令\ls
  2. 将输出发送lsxargs
  3. 给每个项目一个带有变量的变量名称-I(这只是给你一些在mv命令中“看到”的东西)
  4. 将您的项目(称为%)从其位置移动foo到新目的地。

答案2

通过zsh以下pax实现支持-0

printf '%s\0' foo foo/**/*(D) | pax -0rwdv /mnt/bar/ && rm -rf foo

这些递归 glob 在每个级别按词法排序(使用语言环境的排序规则)。a之前a/a之前a/b之前b

find foo -print0 | sort -z请注意,它与对整个路径进行排序并不相同,例如:

a
a/b
a/b.c
a/b/c

在 C 语言环境中按该顺序而不是:

a
a/b
a/b/c
a/b.c

zsh团。

相关内容