1

我对 bash 脚本知之甚少。我需要遍历文件夹及其子文件夹,识别 png 文件,将它们传递给外部 linux 应用程序,并在文本文件中捕获该应用程序的输出,该文本文件的名字与传递给外部的文件相同程序。此外,必须在与 png 文件相同的文件夹中创建 txt 文件。

在搜索 SO 和谷歌搜索后,我想出了以下脚本

#!/bin/sh
cd folder1/folder2

find . -maxdepth 4 -iname '*.png' -type f |while read line; do

    fullfilename="${line##*/}";     
    base="${fullfilename%.*}";
        ext="${fullfilename##*.}";
        mypath="${line%/*}";
    #echo $fullfilename;
    #echo $base;
    #echo $ext;
    #echo $mypath;
    #echo $mypath/$base.txt;
    #echo $line;

    myexternalprogram -x $line > $mypath/$base.txt;
    # -x is a switch reqd by the external program
done

folder2 的几个子文件夹的名称中有空格,例如 Sub Folder 12

运行上面给出一个错误

...line 16: $mypath/$base.txt. ambigous redirect

只是为了检查我删除了第 16 行的重定向部分。我得到了错误

./subfolder1/subfolder2/Sub is an unknown extension

显然是由 myexternal 程序抛出的,因为它卡在子文件夹名称中的空白处。

谁能帮帮我?我究竟做错了什么?

4

3 回答 3

1

尝试在文件名周围加上引号:

myexternalprogram -x "$line" > "$mypath/$base.txt";
于 2013-06-06T17:30:56.290 回答
0

解决了。感谢所有花时间阅读和帮助我的人。

这是引号,即我从键盘键入时得到的引号似乎与从 SO 复制粘贴时得到的引号不同。行 fullfilename="${line## /}"; base="${fullfilename%. }"; ext="${fullfilename##*.}";

已从不同的 SO 帖子/谷歌搜索的博客中复制粘贴。(请记住,我对 bash 知之甚少:D)这些行似乎具有与行 mypath="${line%/*}"; 不同类型的引号。我用键盘输入的。我的键盘上似乎只有一种引号,即“。即使在 openoffice 文字处理器上看起来相同,但在 gedit 中打开我的 bash 文件会产生差异!因此我从 fullfilename 行复制引号并将它们粘贴到我的 mypath 线和 Viola!

谁能启发我为什么有两种类型的引号?我以前从未遇到过这种情况。

于 2013-06-07T00:15:14.430 回答
0

只需引用"$line"即可摆脱空白问题。

于 2013-06-06T17:31:08.023 回答