Bash:如果name包含一个字符串列表,则将文件移动到特定文件夹

时间:2015-11-22 21:05:18

标签: string bash shell unix mv

我有一个脚本,可以在Twitter API中查询多个查询,然后将原始数据写入名称中包含查询的文件以及时间戳。我希望有一个脚本,给定查询字符串列表(正则表达式?)和文件夹中的所有文件,如果其中一个查询字符串是该文件中的子字符串,则将其移动到特定文件夹。现在我只有一个只有几十个mv命令的脚本,但我想要一个更简单,更易于维护的版本。这是我现在正在做的一个例子:

mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*femin*/home/nick/TwitterSearchToDatabase/queries_for_amita/feminism
mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*patriarchy* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism
mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*yesallwomen* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism
mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*womanpower* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism

2 个答案:

答案 0 :(得分:2)

我会使用for循环:

for i in femin patriarchy yesallwomen womanpower; do
  mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*$i* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism
done

这样,列表位于第一行,因此很容易修改。

答案 1 :(得分:2)

我会将数据(要转移到女权主义的词语)和代码隔离开来。 如果您有更多关键字(女权主义等),您可以使用关键字制作文件,并检查您要考虑移动的文件的这些关键字文件。 使用$ {fromdir}文件来源,$ {todir}你想要它们和$ {keyfiledir}的关键字,你会得到类似的东西

for keyfile in ${keyfiledir}/*; do
   key="${keyfile##*/}"
   find $from -type f | sed 's#.*/##' | while read -r file; do
      echo "${file}" | grep -q -f "${keyfiledir}"/"${key}" && mv "${from}"/"${file}" "${to}"/"${key}"
   done
done

这是如何工作的?我使用以下脚本测试了上面的解决方案。

from=fromdir
to=todir
keyfiledir=keyfiledir
rm -rf ${from} ${to} ${keyfiledir}
mkdir ${from} ${to} ${keyfiledir}
mkdir ${to}/feminism ${to}/so
touch ${from}/yesallwomen ${from}/women ${from}/some_femin ${from}/"help move"
cat <<@ > ${keyfiledir}/feminism
femin
patriarchy
yesallwomen
womanpower
@
touch ${from}/yesallwomen ${from}/women ${from}/some_femin

cat <<@ > ${keyfiledir}/so
stack
exchange
help
@

test ! -d "${from}" && echo " Wrong dir ${from}" && exit 1
test ! -d "${to}" && echo " Wrong dir ${to}" && exit 1
test ! -d "${keyfiledir}" && echo " Wrong dir ${keyfiledir}" && exit 1

for keyfile in ${keyfiledir}/*; do
   key="${keyfile##*/}"
   find $from -type f | sed 's#.*/##' | while read -r file; do
      echo "${file}" | grep -q -f "${keyfiledir}"/"${key}" && mv "${from}"/"${file}" "${to}"/"${key}"
   done
done

echo "Not moved"
ls ${from}
echo "Moved"
ls -R ${to}