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变体没有这个,你需要把目的地放在最后。这确实使得与xargs
or一起使用不太方便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