2015-01-10 123 views
0

服务器上有一个脚本,我需要运行该文件夹中的所有文件。在编写shell脚本重复遍历文件夹中所有文件的脚本

for input in /home/arashsa/duo-bokmaal/Bokmaal/DUO_BM_28042.txt ; do 
    name=$(basename "$input") 
    /corpora/bokm/tools/The-Oslo-Bergen-Tagger/./tag-lbk.sh "$input" > "/home/arashsa/duo-bokmaal-obt/$name" 
done 

我是可怕的,并没有成功地发现了如何遍历文件:要运行此脚本在一个文件我用这个shell脚本。我想要的是让脚本迭代给定文件夹中以.txt结尾的所有文件,而不是以_metadata.txt结尾的文件。所以我想我会给它作为参数的文件夹路径,使其遍历该文件夹中的所有文件,并运行脚本上以txt结尾的文件,而不是_metadata.txt

回答

0

在bash:

shopt -s extglob 

for input in /dir/goes/here/*!(_metadata).txt 
do 
    ... 
done 
+0

我该如何转换这个目录是作为参数而不是硬编码给出的?美元符号替换是否够了? –

1

使用find和exec选项。

$ find /path/to/dir -exec <command here> \; 

每个文件或目录都可以使用{}获取。

用法示例:$ find . -exec echo {} \;,这将在当前目录中递归地回显每个文件名或目录名。您可以使用一些其他选项来进一步指定想要处理的所需文件和目录。我将简要解释其中的一些。请注意,echo是多余的,因为find的输出会自动打印,但我会留下来说明exec的工作。这是说,下面的命令产生相同的结果:$ find . -exec echo {} \;$ find .

MAXDEPTH和mindepth 指定MAXDEPTH和mindepth让你深下去的目录结构,只要你喜欢。 Maxdepth确定find将进入目录的次数,mindepth决定在选择文件或目录之前应该输入目录的次数。

示例用法: (1)仅列出此目录中的元素,包括。 (=当前目录)。 (2)仅列出当前目录排除的元素。 从根目录(3)列出的元件和所有显示目录在这个目录

(1)$ find . -maxdepth 1 -exec echo {} \; 
(2)$ find . -mindepth 1 -maxdepth 1 -exec echo {} \; 
# or, alternatively 
(2)$ find . ! -path . -maxdepth 1 -exec echo {} \; 
(3)$ find/-maxdepth 2 -exec echo {} \; 

类型 指定类型选项可以过滤的文件或仅目录,例如使用: (1)列表中的所有文件中这个目录 (2)在根目录中的每个目录上调用shell脚本函数func

(1)$ find . -maxdepth 1 -type f -exec echo {} \; 
(2)$ find/-maxdepth 1 -type d -exec func {} \; 

名&正则表达式 名称选项,您可以搜索特定的文件名,你也可以看看使用正则表达式格式的文件,并显示目录。

实例:找到某个目录

$ find /path/to/dir -maxdepth 1 -regextype sed -regex ".*\.\(avi\|mp4\|mkv\)" 

大小 另一个过滤器是文件大小的任何文件或目录大于该值将被返回的所有电影。用法示例: (1)查找当前目录中的所有空文件。 (2)找到当前目录中的所有非空文件。

(1)$ find . -maxdepth 1 -type f -size 0 
(2)$ find . -maxdepth 1 -type f ! -size 0 

进一步的例子 移动这个目录中的所有文件到一个目录tmp出现在.

$ find . -type f -maxdepth 1 -exec mv {} tmp \; 

转换所有的MKV文件的MP4文件在目录/路径/到/目录和儿童目录

$ find /path/to/dir -maxdepth 2 -regextype sed -regex ".*\.mkv" -exec ffmpeg -i {} -o {}.mp4 \; 

将所有jpeg文件转换为png(不要这样做,它会花费很长时间都能找到并转换它们)。

$ find ~ -maxdepth 420 -regextype sed -regex '.*\.jpeg' -exec mogrify -format png {} \; 

find命令是一个强有力的工具,它可以被证明是卓有成效到管道输出到xargs。需要注意的是这种方法优于以下的建设是非常重要的:

for file in $(ls) 
do 
    some commands 
done, 

,因为后者将处理包含空格的方式不对文件和目录。

相关问题