Answers:
正则表达式不在这里。bash中的通配符(与大多数其他shell一样)仅根据文件名而不是文件类型或其他特征来匹配文件。有一种按类型进行匹配的方法:/
在模式的末尾添加使其仅匹配目录或指向目录的符号链接。这样,您可以移动目录,然后移动剩下的内容,然后再移动目录,这很麻烦,但可以。
tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"
按类型匹配文件的标准方法是调用find
。
find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +
在zsh中,可以使用glob限定符按类型匹配文件。在.
预选赛符合规则的文件; 用于^/
匹配所有非目录,或-^/
还包括指向目录的符号链接。
mv -- *(.) other_directory/
在任何shell中,您都可以简单地循环。
for x in *; do
if ! [ -d "$x" ]; then
mv -- "$x" other_directory/
fi
done
您可以使用类似
find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv "$@" MYDIR' _ {} \;
首先,我们find
通常只在当前目录中查看,然后通过使用! -type d
最后执行的sh
所有内容并将其移至目标目录来忽略目录。您可以尝试 {} +
以更快的速度结束。
-exec sh -c 'mv "$@" MYDIR' _ {} \;
而不是-exec mv {} MYDIR \;
?只是为了获得可以通过将更改为来简化\;
的内容+
?您可以使用-exec mv -t MYDIR {} +
表格进行操作。
-t
旗帜。我还在答案中解释说,+
速度更快,但并非所有find
版本都支持它。因此,上面的代码几乎与所使用的任何find
shell 兼容。
find
shell 都几乎兼容。”的确如此,但是find … -exec mv {} MYDIR \;
使用的资源少于… -exec sh -c 'mv "$@" MYDIR' _ {} \;
。
我建议您仅将mv *.* destination/
destination /作为您要移动的文件夹。
*.*
将移动某些目录并保留一些文件,这不是请求者想要的。