如何使用通配符仅匹配文件而不是目录?

如何使用通配符仅匹配文件而不是目录?

我有一个名为home/homeLife

我有一个名为 home1 home2 和 home3 的文件存储在 /home 中

我想将所有以 开头的文件home*移至home/homeLife/..

我输入了

mv home* /home/homeLife
cannot move homeLife into subdirectory of itself

我的问题:如何排除目录?

答案1

使用zshglob 限定符:

mv home*(.) dst 

仅移动常规的文件。

尽管

mv home*(^/) dst 

移动任何类型的文件除了目录。

mv home*(^-/) dst

还将排除目录的符号链接。

答案2

您可以使用查找。以下应该有效。

find . -name home\* -type f -maxdepth 1 -exec mv {} /home/homeLife/. \;

答案3

您可以使用 bash 扩展 glob:

shopt -s extglob                ## activate extglogs if not yet done
mv  home!(*Life) homeLife/      ## !(p1|...) = anything except one of the patt

答案4

您可以方便地修剪您的全局匹配列表:

set --; cd /home
for f in ./home*
do  [ ! -L "$f" ] && 
      [ -f "$f" ] && 
      set "$@" "$f"
done
[ "$#" -eq 0 ] || mv "$@" ./homeLife

相关内容