我正在处理一个需要每晚运行的进程,并将 tar.gz 一大列文件(对于 tar 命令来说太大了)。要解决此问题,我可以创建一个我希望 tar 归档的文件列表并将其传入。我通常手动执行此操作,但我想使用 crontab 使其自动化。
本例中的操作系统是 RedHat Enterprise 6.3 (Santiago)。
我有以下 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 参数中指定的文件写入任何内容。如果我接受回显的命令并将其复制并粘贴到 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 ']'
最佳答案
在脚本中切换到以下语法,没有任何变量分配,解决了这个问题。
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
但不完全确定为什么变量替换会添加错误的单引号。
关于regex - 查找命令在命令行中有效,但在脚本中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399957/