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