shell脚本返回文件未找到

时间:2015-02-09 17:33:31

标签: shell

我正在尝试编写一个简单的shell脚本来读取文件,并在文件读取时找到另一个文件名,并在两个文件上执行一些基本操作(cp和mv),下面是简化代码(但结果是相同的):

#!/bin/bash


for header in `ls -l XXXXACT_*.dat | awk '{ print $9 }'`
do
    payload=`cat $header | nawk -F "/" '{ print $8 }' | sed 's/APP.*//' | tr -d "\012"`
    echo  "$header"
    echo "$payload"
    ls -l $payload

我得到的结果如下:

XXXXFACT_000000424.dat
FILEACT_000424.TXT
FILEACT_000424.TXT: No such file or directory

但如果我在文件名上运行ls,我会得到一个结果:

ls -l FILEACT_000424.TXT
-rwxr-xr-x   1 stlts    stlts        292 Feb  9 12:14 FILEACT_000424.TXT

在下面找到文件XXXXFACT_000000424.dat:

的示例
0000 APP_APPLI_CODE XXXFACTAPP_FILE_NB 000424APP_FLOW IMPORT
0101 APP_MSG_NB 001APP_COMPANY XXXXXXXX_TESTAPP_SERVICE   XXXXXS0_IMPORTAPP_MSG_NAT FICAPP_MSG_TYPE FICAPP_CORR_ID XXXXXX20XXXAPP_MSG_TXT_TYPE FICAPP_MSG_TXT /xxxxx/xxxxx/xxxxx/fileact/xxxxxx/import/FILEACT_000424.TXTAPP_ENDFCT EOM
0000 APP_ENDFILE EOF

对于我为什么会遇到这种行为以及/或有关如何解决这个问题的想法/建议的任何解释都是受欢迎的。

该脚本将在SunOs 5.10上运行,我使用cp获得以下结果:

cp: cannot access FILEACT_000424.TXT

我确保我在正确的目录中。

感谢阅读。

2 个答案:

答案 0 :(得分:2)

对于您从Windows复制的文件,请使用dos2unix

进行转换

重写您的代码段:

for header in XXXXACT_*.dat; do
    payload=$( nawk '/\/.*APP/ {sub(/.*\//,""); sub(/APP.*/,""); print}' "$header" )
    echo "$header"
    echo "$payload"
    ls -l "$payload"

注释

  • 不要循环ls输出,直接遍历文件名扩展
  • 当程序可以自己处理文件时,不需要cat
  • awk可以执行您使用sed
  • 的操作
  • 使用$()代替反对
  • 始终引用"$variables",除非您确切知道何时不使用它们。

答案 1 :(得分:0)

感谢大家阅读并提出了解决问题的新方法,这是我在这里的第一篇文章,我已经学到了很多东西!

我想通了,我在$ header文件上运行了一个cat -v,可以看到$ payload文件名后面不可见:

FILEACT_000093.TXT^W

我试图用sed作为测试删除它,示例代码如下:

for header in XXXXFACT_*.dat; do

    payload=$( nawk '/\/.*APP/ {sub(/.*\//,""); sub(/APP.*/,""); print}' "$header" )
    echo $header
    payloadx=$( echo "${payload}" | sed 's/^W//g' )
    echo "$payloadx"
    ls -l "$payloadx"
    echo ""

done

以上按预期工作