迭代文件夹中所有文件的脚本

时间:2015-01-10 22:09:00

标签: shell

服务器上有一个脚本需要在文件夹中的所有文件上运行。要在一个文件上运行此脚本,我使用此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

2 个答案:

答案 0 :(得分:1)

使用find和exec选项。

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

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

示例用法:$ find . -exec 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 {} \;

名称&amp;正则表达式 name选项允许您搜索特定的文件名,您还可以使用正则表达式格式查找文件和目录。

使用示例:查找特定目录中的所有电影

$ 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文件转换为dir / path / to / dir和子目录中的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,

因为后者将以错误的方式处理包含空格的文件和目录。

答案 1 :(得分:0)

在bash中:

shopt -s extglob

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