在shell脚本中搜索图像文件扩展名

时间:2014-03-06 04:25:55

标签: shell file-extension

// Gets all the image names in a directory and its subdirectories then appends them to an array called allFiles.
allFiles =$(ls -R | grep -E "(jpg|png\gif)")

// Gets all the image names used in list.txt and appends them to an array called list.
list=$(grep -Po '".*?"' list.xml | rev | cut -c 2- | rev | cut -c 2-)

for file in AllFiles
do
    notFound = 1

脚本应该查看所有文本类型的扩展名(例如:txt,cpp,py,c,html,xml,json)并创建引用的图像文件列表。这包括不在当前工作文件夹中但在其中的文件夹中的文件。然后应该使用此列表并将其与当前目录中的图像文件列表(例如:jpg,png,gif)进行比较。如果目录中存在文件但当前目录中的任何文件都未引用该文件,则应将其作为未引用文件打印出来。不知道我做错了什么。有人请帮忙

1 个答案:

答案 0 :(得分:0)

allFiles的'赋值'在=之前有一个空格,因此它会尝试运行名为allFiles的命令,但可能会失败。假设这是问题中的拼写错误,您没有使用数组赋值表示法。那将是:

allFiles=( $(ls -R | grep -E "(jpg|png\gif)") )

我在内部命令替换中放置了句法上不必要的空格,但如果没有它们,括号的嵌套变得难以解释。

您对list的分配存在同样的基本问题。

剩下的就是指出解析ls的输出容易出错,特别是如果文件名可能包含空格或换行符。

作为极端情况,请考虑:

$ ls -la | cat
total 0
drwxrwxr-x 0 jleffler eng 0 Mar  5 21:14 .
drwxrwxr-x 0 jleffler eng 0 Feb 21 16:15 ..
drwxrwxr-x 0 jleffler eng 0 Mar  5 21:15 .
drwxrwxr-x 0 jleffler eng 0 Mar  5 21:14 .
drwxrwxr-x 0 jleffler eng 0 Feb 21 16:15 ..
$

我使用以下方式制作了这个:

$ mkdir xyz
$ cd xyz
$ y=".
> $(ls -la | sed 1d)"
$ mkdir "$y"
$

而且,仅供参考,GNU ls到终端的输出是:

$ ls -la
total 0
drwxrwxr-x 0 jleffler eng 0 Mar  5 21:14 .
drwxrwxr-x 0 jleffler eng 0 Feb 21 16:15 ..
drwxrwxr-x 0 jleffler eng 0 Mar  5 21:15 .?drwxrwxr-x 0 jleffler eng 0 Mar  5 21:14 .?drwxrwxr-x 0 jleffler eng 0 Feb 21 16:15 ..
$