我在命令行中运行以下命令:
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循环已解决此问题。但我仍然无法理解为什么会这样。任何人吗?
答案 0 :(得分:1)
添加到您的脚本:
echo "My shell is: " $0
echo "My IFS is:" $IFS
并将其与交互式shell的结果进行比较。
通过添加hashbang行确保您的脚本由您想要的脚本执行。
根据man sh,IFS定义为:
输入字段分隔符。通常设置为⟨space⟩, ⟨tab⟩,和⟨newline⟩。请参阅White Space Splitting部分 了解更多详情。
答案 1 :(得分:1)
在反引号中捕获find
输出将有效地加入所有行。这将打破带有嵌入空格的文件名。
for find ${ROOT_DIR} -type f -mtime +$DAYS_ARCH |
egrep -v -e 'archive/'
while read ...
循环将一次只读取一个路径名,即使它们包含空格或其他特殊字符。