vic*_*ico 3 command-line directory
我有目录结构:
~/MYDIR/
/DESTINATIONDIR/
/DIR1/
/DIR2/
/file1
/file2
Run Code Online (Sandbox Code Playgroud)
我需要移动DIR1, DIR2,file1,file2
到DESTINATIONDIR
从终端执行此操作的最优雅和最佳方式是什么?
UPD:假设我们有更多不同名称的文件和目录
我会考虑三种方法来做到这一点。
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
事先运行,它会起作用。