使用日志删除旧目录

时间:2011-01-02 10:16:23

标签: bash

我的IM根据联系人姓名存储日志。我创建了一个包含活动联系人列表的文件。我的问题是:

我想创建一个bash脚本,从文件中读取活动的联系人名称,并将其与目录进行比较。如果列表中找不到目录名,它将被移动到另一个目录(让我们称之为“archive”)。我试着为你想象它。

  • 列表内容:

contact1
contact2

  • 目录的内容

contact1
contact2
contact3
contact4

  • 运行脚本后,dir的内容为:

contact1
contact2

contact3 ==> ../archive
contact4 ==> ../档案

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

mv $(ls | grep -v -x -F -f ../file.txt) ../archive

其中 ../ file.txt 包含不应移动的目录的名称。这里假设当前目录只包含目录,如果不是这样的话,ls应该用其他东西替换。请注意,如果没有应该移动的目录,该命令将失败。

因为在对其他答案的评论中,您声明可能出现名称中带有空格的目录,您可以将其替换为:

for i in *
do
    echo $i | grep -v -x -q -F -f ../file.txt && mv "$i" ../archive
done

答案 1 :(得分:0)

可能有一个更简洁的解决方案,但这有效。我强烈建议先在mv前加echo对其进行测试,否则如果不按照自己的意愿行事,最终可能会造成严重的混乱。

declare -A contacts
for contact in "$@"
do
  contacts[$contact]=1
done
ls a | while read contact
do
  if [[ ! ${contacts[$contact]} ]]
  then
    mv "a/$contact" ../archive
  fi
done

答案 2 :(得分:0)

这是marcog答案的改进版本。请注意,关联数组需要Bash 4。

#!/bin/bash
sourcedir=/path/to/foo
destdir=/path/to/archive
contactfile=/path/to/list

declare -A contacts

while read -r contact
do
    contacts[$contact]=1
done < "$contactfile"

for contact in "$sourcedir"/*
do
    if [[ -f $contact ]]
    then
        index=${contact##*/}
        if [[ ! ${contacts[$index]} ]]
        then
            mv "$contact" "$destdir"
        fi
    fi
done

修改

如果您要移动目录而不是文件,请将上面的for循环更改为如下所示:

for contact in "$sourcedir"/*/
do
    index=${contact/%\/}
    index=${index##*/}
    if [[ ! ${contacts[$index]} ]]
    then
        mv "$contact" "$destdir"
    fi
done