将所有文件和目录移动到目标目录

vic*_*ico 3 command-line directory

我有目录结构:

~/MYDIR/
  /DESTINATIONDIR/
  /DIR1/
  /DIR2/
  /file1
  /file2
Run Code Online (Sandbox Code Playgroud)

我需要移动DIR1, DIR2,file1,file2DESTINATIONDIR

从终端执行此操作的最优雅和最佳方式是什么?

UPD:假设我们有更多不同名称的文件和目录

Oli*_*Oli 8

我会考虑三种方法来做到这一点。

Hacky 和错误助长,“移动所有的东西”

mv ~/MYDIR/* ~/MYDIR/DESTINATIONDIR
Run Code Online (Sandbox Code Playgroud)

这将尝试将目标移动到自身并爆炸:

mv: cannot move ‘~/MYDIR/DESTINATIONDIR’ to a subdirectory of itself, ‘~/MYDIR/DESTINATIONDIR/DESTINATIONDIR’
Run Code Online (Sandbox Code Playgroud)

但它会[几乎]移动其他所有东西。所以它有效,但有点混乱。如果您需要匹配隐藏文件,请shopt -s dotglob事先运行,它会起作用。

手动移动文件列表

鉴于事物的简短列表,我们可以很容易地通过一些 bash 扩展将它们列出来:

 mv ~/MYDIR/{DIR{1,2},file{1,2}} ~/MYDIR/DESTINATIONDIR
Run Code Online (Sandbox Code Playgroud)

如果您需要使用此方法隐藏文件,只需将它们包含在列表中。

如果此列表来自其他内容(例如find),则很难确保目的地是最后一个参数。您可以使用-t参数将目标移动到前面。这是一个可怕的例子,但在您需要时突出显示:

find ~/MYDIR/ -maxdepth 1 ! -name DESTINATIONDIR -exec mv -t ~/MYDIR/DESTINATIONDIR {} +
Run Code Online (Sandbox Code Playgroud)

使用shopt,优雅定义的反向通配符。

因此,让我们在手动列出和通配符之间取得平衡。通过开启猛砸扩展通配符功能,我们可以选择[近]一切,但目标目录。

shopt -s extglob
mv ~/MYDIR/!(DESTINATIONDIR) ~/MYDIR/DESTINATIONDIR
Run Code Online (Sandbox Code Playgroud)

如果您需要匹配隐藏文件,请shopt -s dotglob事先运行,它会起作用。