linux/bash 相当于 mv -t

linux/bash 相当于 mv -t
ls -al | grep -v '^d' | xargs mv -t mysubdir

我在 Red Hat 系统上广泛使用上述命令。

它将当前目录中的所有文件移动到 mysubdir

$ mv --version
Usage: mv [-f] [-i] [-e warn|force|ignore] f1 f2
       mv [-f] [-i] [-e warn|force|ignore] f1 ... fn d1
       mv [-f] [-i] [-e warn|force|ignore] d1 d2

上述命令在 HP-UX 中的等效命令是什么(HP-UX 11i 版本 3 Feb 2007)

答案1

如果xargs您的 HP-UX 11i 上有标志,-I您可以执行此操作,尽管我不完全确定您如何设法使用ls -l以下输出mv

ls -al | grep -v '^d' | xargs -I {} mv {} mysubdir

如果您无法做到这一点,我认为这将是我的首选解决方案:

ls -a | while read ITEM; do test ! -d "$ITEM" && mv "$ITEM" mysubdir; done

两者都可以包含在 shell 函数或脚本中,因此单行的长度不一定相关。

答案2

mv -t是 GNUmv命令(Linux 上的命令)提供的一种便利。其他unix变体没有这个,你需要把目的地放在最后。这确实使得与xargsor一起使用不太方便find … -exec(这就是mv -t发明的原因)。

将参数按正确顺序排列的一种方法是调用 shell。

… | xargs sh -c 'mv "$@" "$0"' mysubdir

(是 shell 的参数 0;通过组成位置参数mysubdir批量传递的参数。)xargs"$@"

请注意,这xargs并不健壮:它需要使用特殊的引号语法进行输入。如果您的文件名包含空格或字符之一\"',您的代码片段就会中断。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?了解更多信息。为了避免文件名中的特殊字符出现问题,请使用find … -exec …

find . -name . -o -type d -prune -o sh -c 'mv "$@" "$0"' mysubdir {} +

-name . -o -type d -prune -o跳过子目录而不递归到它们。)

对于移动非目录的用例,如果mysubdir其本身尚不包含子目录,则移动所有文件,然后将目录移回会更简单:

mv * mysubdir/; mv mysubdir/*/ .

或者,由于您不想递归到子目录,因此可以使用 shell 循环来枚举文件,并跳过属于目录的文件。

for x in ./*; do
  [ -d "$x" ] || mv "$x" mysubdir/
done

相关内容