我的IM根据联系人姓名存储日志。我创建了一个包含活动联系人列表的文件。我的问题是:
我想创建一个bash脚本,从文件中读取活动的联系人名称,并将其与目录进行比较。如果列表中找不到目录名,它将被移动到另一个目录(让我们称之为“archive”)。我试着为你想象它。
contact1
contact2
contact1
contact2
contact3
contact4
contact1
contact2
contact3 ==> ../archive
contact4 ==> ../档案
答案 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