如何在find中使用多个参数?

时间:2016-03-08 05:12:42

标签: bash shell scripting find

我需要在我的脚本中使用find命令,如下所示:

#!/bin/bash
...

find /root/olddir/ -name "*.log" -type f | xargs -I '{}' mv {} /root/newdir/

...

但是我需要设置olddir / newdir并像这样使用多个目录:

/root/olddir/ --> /root/newdir/
/root/olddir2/ --> /root/newdir2/
/root/olddir3/ --> /root/newdir3/
/root/another_olddir3/ --> /root/another_newdir3/
/home/old/ --> /home/new/
...

我可以使用conf文件吗?如何在conf文件中读取参数如下:

param.conf:

#olddir;newdir
/root/olddir/;/root/newdir/
/root/olddir2/;/root/newdir2/
/root/olddir3/;/root/newdir3/
/root/another_olddir3/;/root/another_newdir3/
/home/old;/home/new/

2 个答案:

答案 0 :(得分:1)

find不接受配置文件中的选项

单个find可以在多个输入上运行并移动到不同的位置,但它会非常复杂。编写一些shell代码来解析配置文件并为你执行find会更好。

e.g。类似的东西:

CONFIG_FILE="/some/conf"
...
while IFS=';' read -r src dst; do
  find "${src}" -name '*.log' -type f -exec mv {} "${dst}" \;
done <"${CONFIG_FILE}"

答案 1 :(得分:1)

你从来没有回答我的问题,所以我只能猜测。我做了以下假设:

  • 文件夹列表需要与脚本本身分开维护,因此不可能将它们直接放入脚本中。

  • 旧目录名和新目录名之间的对应关系模式是提出的问题所特有的,因此脚本不能依赖它

  • 您愿意信任配置文件的格式和内容

其次,我认为你说要执行的命令确实是你想要执行的命令。如果事实证明不是,那么你应该能够使我的答案适应不同的命令。

最重要的是,您无法使用单个find命令执行所述操作,您需要一种方法来执行多个find命令。有几种选择,但嵌入式awk脚本似乎非常适合您提出的问题。像这样的东西,偶然:

#!/bin bash

# For convenience in case you ever want to change it, read it from
# a command-line argument, etc:
conffile=/etc/logcopy.conf

# The awk script is provided inline as a heredoc.
# Awk is instructed to use a semicolon as field separator as needed for the
# proposed config file format.
# The config file is given as awk's input
awk -F ';' -f - $conffile <<'EOF'

# skip comments
/\s*#/ { next }

# run the given command, where $1 and $2 are the directory names read from
# one line of the config file
{ system("find $1 -name '*.log' -type f | xargs -I '{}' mv {} $2") }

EOF