当我运行以下命令时:
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'
- 用于
ls
按字母顺序列出项目。为了确保您运行的是纯粹的ls
(没有由隐藏在 .bashrc 或 .bash_aliases 中的别名添加的额外字符),请以 .bashrc 或 .bash_aliases 的形式运行命令\ls
。 - 将输出发送
ls
至xargs
- 给每个项目一个带有变量的变量名称
-I
(这只是给你一些在mv
命令中“看到”的东西) - 将您的项目(称为
%
)从其位置移动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
团。