我有目录结构:
~/MYDIR/
/DESTINATIONDIR/
/DIR1/
/DIR2/
/file1
/file2
我需要DIR1, DIR2,file1,file2
搬到DESTINATIONDIR
从终端执行此操作的最优雅和最佳方法是什么?
UPD:假设我们有更多不同名称的文件和目录
答案1
我认为有三种方法可以实现此目的。
充满黑客和错误的“移动所有的东西”
mv ~/MYDIR/* ~/MYDIR/DESTINATIONDIR
这会尝试将目的地移入其自身并爆炸:
mv: cannot move ‘~/MYDIR/DESTINATIONDIR’ to a subdirectory of itself, ‘~/MYDIR/DESTINATIONDIR/DESTINATIONDIR’
但它会移动 [几乎] 所有其他东西。所以它能工作,但有点乱。如果您需要匹配隐藏文件,请shopt -s dotglob
事先运行,它就会工作。
手动移动文件列表
给出简短的列表,我们可以很容易地用一点 bash 扩展列出它们:
mv ~/MYDIR/{DIR{1,2},file{1,2}} ~/MYDIR/DESTINATIONDIR
如果您需要使用此方法隐藏文件,只需将它们包含在列表中即可。
如果此列表来自其他内容(例如find
),则很难确保目的地是最后一个参数。 您可以使用参数将目的地移到前面-t
。 这是一个糟糕的例子,但在您需要时会突出显示:
find ~/MYDIR/ -maxdepth 1 ! -name DESTINATIONDIR -exec mv -t ~/MYDIR/DESTINATIONDIR {} +
用 进行逆向匹配shopt
,优雅定义。
因此,让我们在手动列出和通配符之间取得平衡。通过打开 Bash 中的扩展通配符功能,我们可以选择 [几乎] 所有内容但目标目录。
shopt -s extglob
mv ~/MYDIR/!(DESTINATIONDIR) ~/MYDIR/DESTINATIONDIR
如果需要匹配隐藏文件,请先运行shopt -s dotglob
即可。
答案2
关于什么:
cd ~/MYDIR
mv DIR* file* DESTINATIONDIR