【问题标题】:Exclude directories from pathname expansion results从路径名扩展结果中排除目录
【发布时间】:2021-01-08 02:39:12
【问题描述】:

我有 100 个目录,需要将某个列表中的目录移动到一个新目录中。

我正在尝试以下变化:

for A in !(sub-9002 sub-9003 sub-9004 sub-9005 sub-9008 sub-9009 sub-9011 sub-9014 sub-9018 sub-9020 sub-9023 sub-9025 sub-9026 sub-9028 sub-9029 sub-9033 sub-9034 sub-9036 sub-9038 sub-9039 sub-9040 sub-9041 sub-9042 sub-9045 sub-9046 sub-9047 sub-9048 sub-9049 sub-9055 sub-9058 sub-9061 sub-9062 sub-9064 sub-9065 sub-9068 sub-9069 sub-9071 sub-9072 sub-9079 sub-9080 sub-9081 sub-9084 sub-9085 sub-9086 sub-9087 sub-9088 sub-9089 sub-9092 sub-9093 sub-9094 sub-9096 sub-9098 sub-9100);
do 
   mv -f $A Bad/;
done

我也在尝试:

if [[! A in (sub-9002 sub-9003 sub-9004 sub-9005 sub-9008 sub-9009 sub-9011 sub-9014 sub-9018 sub-9020 sub-9023 sub-9025 sub-9026 sub-9028 sub-9029 sub-9033 sub-9034 sub-9036 sub-9038 sub-9039 sub-9040 sub-9041 sub-9042 sub-9045 sub-9046 sub-9047 sub-9048 sub-9049 sub-9055 sub-9058 sub-9061 sub-9062 sub-9064 sub-9065 sub-9068 sub-9069 sub-9071 sub-9072 sub-9079 sub-9080 sub-9081 sub-9084 sub-9085 sub-9086 sub-9087 sub-9088 sub-9089 sub-9092 sub-9093 sub-9094 sub-9096 sub-9098 sub-9100)]]; then 
    mv -f $A Bad/;
fi

【问题讨论】:

  • 真正的问题是什么?有任何错误信息吗?任何文件没有被移动?另外,Use More Quotes™!

标签: bash loops


【解决方案1】:

你可以使用负匹配扩展全局模式,但你需要先做set -s extglob,然后模式语法是!(sub-9002|sub-9003|sub-9004|...)。我还建议使用小写或混合大小写的变量名称(有一堆具有特殊含义的全大写名称,您不想意外使用其中一个),以及双引号变量引用(例如"$a" 而不仅仅是$a) 以避免奇怪的解析问题。哦,行尾不需要分号。

shopt -s extglob
for a in !(sub-9002|sub-9003|sub-9004|sub-9005|sub-9008|sub-9009|sub-9011|sub-9014|sub-9018|sub-9020|sub-9023|sub-9025|sub-9026|sub-9028|sub-9029|sub-9033|sub-9034|sub-9036|sub-9038|sub-9039|sub-9040|sub-9041|sub-9042|sub-9045|sub-9046|sub-9047|sub-9048|sub-9049|sub-9055|sub-9058|sub-9061|sub-9062|sub-9064|sub-9065|sub-9068|sub-9069|sub-9071|sub-9072|sub-9079|sub-9080|sub-9081|sub-9084|sub-9085|sub-9086|sub-9087|sub-9088|sub-9089|sub-9092|sub-9093|sub-9094|sub-9096|sub-9098|sub-9100);
do 
   mv -f "$a" Bad/
done

顺便说一句,[[ ]] 条件表达式没有 in 运算符之类的东西。但它们确实需要[[ 之后和]] 之前的空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2019-01-14
    • 2014-04-29
    • 2019-12-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多