3

我在命令行中运行以下命令:

for DATAFILE in `find dir_name -type f -mtime +10 | egrep -v -e 'archive/'`
do
    echo 'Data file name- ' "$DATAFILE"
    echo 'Base name ' 
    BASENAME=`basename "${DATAFILE}"`
    DESTFILE="${BASENAME}"_`date +"%Y%m%d%H%M%S"`
    echo "Dest file - "$DESTFILE
done

为此,我得到以下结果:

Data file name-  DIR_PATH_1/file_1.txt
Base name
Dest file - file_1.txt_20120719041239
Data file name-  DIR_PATH_2/file_2.txt
Base name
Dest file - file_2.txt_20120719041239

当我将相同的命令放入 shell 脚本并执行时,我得到以下结果:

Data file name-  DIR_PATH_1/file_1.txt
DIR_PATH_2/file_2.txt
Base name
Dest file - file_2.txt_20120719040956

我已经检查了 Control-M 和其他垃圾字符的脚本。另外,我在 shell 脚本中没有任何额外的步骤(没有参数和全部)。

有人可以指出我正确的方向。

谢谢。

更新1:

我对循环进行了以下更改:

早些时候:

for DATAFILE in `find ${ROOT_DIR} -type f -mtime +$DAYS_ARCH | 
                     egrep -v -e 'archive/'`

现在:

find ${ROOT_DIR} -type f -mtime +$DAYS_ARCH |
     egrep -v -e 'archive/' | while read DATAFILE

它现在似乎工作正常。我仍在测试以确认这一点。

更新 2:

从 FOR 更改为 WHILE 循环已解决此问题。但我仍然无法理解为什么会这样。任何人?

4

2 回答 2

1

添加到您的脚本:

echo "My shell is: " $0
echo "My IFS is:" $IFS

并将其与交互式 shell 的结果进行比较。

通过添加hashbang行,确保您的脚本由您想要的脚本执行。

根据man sh, IFS 定义为:

输入字段分隔符。这通常设置为⟨space⟩、⟨tab⟩和⟨newline⟩。有关更多详细信息,请参阅空白分割部分。

于 2012-08-09T07:40:29.030 回答
1

find在反引号中捕获输出将有效地连接所有行。这将破坏带有嵌入空格的文件名。

对于 DATAFILE 在find ${ROOT_DIR} -type f -mtime +$DAYS_ARCH | egrep -v -e 'archive/'

循环一次将while read ... 只读取一个路径名,即使它们包含空格或其他特殊字符。

于 2012-08-10T00:04:45.983 回答