簡體   English   中英

查找命令可從命令行運行,但不能在腳本中運行

[英]Find command works from command line but not in a script

我正在研究一個需要每晚運行的進程,它將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參數中指定的文件寫入任何內容。 如果我使用已回顯的命令並將其復制並粘貼到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

但不能完全確定為什么變量替換會添加錯誤的單引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM