如何选择处理文件的顺序mv
? (我的意思是,我可以手动调用它,但是保留路径和递归工作的工作很快就会成为问题)
我有一个 fs 安装在 /mnt 上,另一个安装在 /home 上
/mnt 有各种文件,在很多文件夹中
我想全部移动到/home
但我想选择移动它们的顺序
例如,我希望在 /mnt/b/d/g/e/file 之前处理 /mnt/a/t/d/v/file
如果有任何可用的排序,我可以使用它(我认为)
答案1
当你这样做时:
mv /mnt/* /home/
它是 shell 扩展/mnt/*
到匹配文件列表(对于该模式,这将是 中的所有非隐藏文件/mnt
)并将结果传递给mv
,因此mv
将接收mv
, /mnt/a
, /mnt/b
, /mnt/c
.../home/
作为单独的参数。
默认情况下,Shell 按词法对它们的全局扩展进行排序。在 zsh shell 中,可以使用o
/ O
glob 限定符更改顺序。
/mnt/a
会被移到前面,/mnt/b
因为按词法a
排序在前面b
。如果你想以相反的顺序移动它们,你可以这样做:
mv /mnt/*(DOn) /home/
在 zsh 中(还添加D
限定符来移动隐藏文件)。
如果您想/mnt/b
先移动,您可以这样做:
set -o extendedglob
mv /mnt/b /mnt/^b(D) /home/
或者:
mv /mnt/b /home/ && mv /mnt/*(D) /home/
通常,mv
只做一些rename()ing
,所以它不会递归地工作。但是,当跨文件系统移动时,它无法做到这一点,因此它采取递归复制,然后删除原始文件的方式。
In 中mv /mnt/* /home/
,where/mnt
和/home
are 在两个不同的文件系统上,/mnt/a
将被移到 之前,但是当涉及或/mnt/b
中的文件时,顺序是未指定的,您通常无法控制它。/mnt/a
/mnt/b
要对这些顺序有发言权,您必须手动移动单个文件,或者您可以诉诸cpio -p
或pax -rw
可以被告知按给定顺序复制文件(然后手动删除源)。