我需要在我的脚本中使用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/
答案 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