我正在开发一个需要每晚运行的进程,并且会tar.gz一大堆文件(与tar命令相比太大)。为了解决这个问题,我可以创建一个我希望tar存档并传入的文件列表。我通常手动执行此操作,但我想使用crontab自动执行此操作。
本案例中的操作系统是RedHat Enterprise 6.3(圣地亚哥)。
我有以下bash shell脚本:
#!/bin/bash
now=$(date +"%Y%m%d")
TARGET_DIR=/usr/share/data
FILE_LIST=/home/user/txt-files/data-as-of-$now.txt
if [ -e $FILE_LIST ];
then
rm -rf $FILE_LIST
fi
CMD="find $TARGET_DIR -regextype posix-extended -regex \".*/$now.*\" -fprint $FILE_LIST"
echo $CMD
findCmd=`$CMD`
if [ $? -ne 0 ];
then
echo "command failed; $findCmd"
fi
脚本运行正常,但不会将任何内容写入-fprint参数中指定的文件。如果我接受echo命令并将其复制并粘贴到cli,它就像我期望的那样工作,我的文件包含我想要的文件列表。
find /usr/share/data -regextype posix-extended -regex ".*/20140624.*" -fprint /home/user/txt-files/data-as-of-20140624.txt
我猜这个正则表达式有一些时髦的东西,当作为脚本运行时被错误地解释而不是来自CLI的命令。我已经在其他帖子中读到了将星号括在引号中的必要性,并且我已经尝试过单一刻度和双刻度,似乎都不起作用。我也尝试了执行命令的后退方式和$()方式,两者都产生相同的结果。
如果我收到任何错误或消息,那就不那么令人困惑了。如果有人能够看到并且看我是否做了明显错误的事情,我会很感激指针!
如果我用bash -x运行命令,我得到这个输出:
[user@data-provider bin]$ bash -x tgz2.sh
++ date +%Y%m%d
+ now=20140624
+ TARGET_DIR=/usr/share/data
+ FILE_LIST=/home/user/txt-files/data-as-of-20140624.txt
+ '[' -e /home/user/txt-files/data-as-of-20140624.txt ']'
+ rm -rf /home/user/txt-files/data-as-of-20140624.txt
+ CMD='find /usr/share/data -regextype posix-extended -regex '\''.*/20140624.*'\'' -fprint /home/user/txt-files/data-as-of-20140624.txt'
+ echo find /usr/share/data -regextype posix-extended -regex ''\''.*/20140624.*'\''' -fprint /home/user/txt-files/data-as-of-20140624.txt
find /usr/share/data -regextype posix-extended -regex '.*/20140624.*' -fprint /home/user/txt-files/data-as-of-20140624.txt
++ find /usr/share/data -regextype posix-extended -regex ''\''.*/20140624.*'\''' -fprint /home/user/txt-files/data-as-of-20140624.txt
+ findCmd=
+ '[' 0 -ne 0 ']'
答案 0 :(得分:1)
在脚本中切换到以下语法,没有任何变量赋值,修复了问题。
find $TARGET_DIR -regextype posix-extended -regex ".*/$now.*" -fprint $FILE_LIST
我用
测试的原始语法的问题cmd="find -regex '.*/test.*' -fprint out.txt
$cmd
是以
运行的find -regex ''\''.*/test.*'\''' -fprint out.txt
但不完全确定为什么变量替换会添加错误的单引号。