2011-12-29 134 views
1

我想写一个逐行扫描文件的bash脚本(忽略头文件),从每行的开头提取一个文件名,然后找到一个文件这个名字在一个目录中并将其移动到另一个目录。我将循环处理数百个这样的文件并移动超过一百万个单独的文件。该文件的示例是:BASH shell脚本文件解析[新手]

ImageFileName Left_Edge_Longitude Right_Edge_Longitude Top_Edge_Latitude Bottom_Edge_Latitude 

21088_82092.jpg: -122.08007812500000 -122.07733154296875 41.33763821961143 41.33557596965434 

21088_82093.jpg: -122.08007812500000 -122.07733154296875 41.33970040427444 41.33763821961143 

21088_82094.jpg: -122.08007812500000 -122.07733154296875 41.34176252364274 41.33970040427444 

我想忽略第一行然后抓取21088_82092.jpg作为变量。文件名可能并不总是相同的长度,但他们将始终具有格式digit_digits.jpg

任何有效的方法的帮助,非常感谢。

+0

编辑您的帖子以向我们展示您迄今为止已尝试过的内容并包含任何错误输出。几乎每周都会问这样的问题,所以请尝试在这里搜索。祝你好运。 – shellter 2011-12-29 04:20:43

回答

0

这应该让你开始:

$ tail -n +2 input | cut -f 1 -d: | while read file; do test -f $dir/$file && mv -v $dir/$file $destination; done 
+0

这很棒,完全符合我的需求。 – user1120422 2011-12-29 05:29:37

0

您可以构建一个脚本,会做这样的事情,然后只需运行该脚本。下面的命令会给你一个脚本,将文件从一个位置复制到另一个,但你可以使脚本生成更复杂简单地通过改变awk输出:

pax:~$ cat qq.in 
ImageFileName  Left_Edge_Longitude Right_Edge_Longitude 
21088_82092.jpg: -122.08007812500000 -122.07733154296875 
21088_82093.jpg: -122.08007812500000 -122.07733154296875 
21088_82094.jpg: -122.08007812500000 -122.07733154296875 

pax:~$ awk -F: '/^[0-9]+_[0-9]+.jpg:/ { 
     printf "cp /srcdir/%s /dstdir\n",$1 
    } {}' qq.in 

cp /srcdir/21088_82092.jpg /dstdir 
cp /srcdir/21088_82093.jpg /dstdir 
cp /srcdir/21088_82094.jpg /dstdir 

您捕捉到脚本的输出(最后三行)到另一个文件,那么这个文件就是你的脚本来做实际的拷贝。

+0

或者,一旦你确信它会做你想做的事,就把脚本管到'sh'。 – 2011-12-29 04:47:31

+0

你可以通过使用'awk -F:'来分割冒号,然后'$ 1'就是你需要的文件名。 – 2011-12-29 04:48:29

+0

不错,@Jonathan,编辑适合。 – paxdiablo 2011-12-29 05:01:04