我的Bash脚本的部分功能是接受目录名,然后遍历每个文件。
以下是我的代码的一部分:
#! /bin/bash
# sameln --- remove duplicate copies of files in specified directory
D=$1
cd $D #go to directory specified as default input
fileNum=0 #save file numbers
DIR=".*|*"
for f in $DIR #for every file in the directory
do
files[$fileNum]=$f #save that file into the array
fileNum=$((fileNum+1)) #increment the fileNum
echo aFile
done
echo语句用于测试目的。我作为一个参数传递了一个包含四个常规文件的目录的名称,我希望我的输出看起来像:
å文件
å文件
å文件
å文件
但是echo语句只显示一次。
答案 0 :(得分:0)
单项操作
为此使用find
,它非常适合它。
find <dirname> -maxdepth 1 -type f -exec echo "{}" \;
标志解释:maxdepth
定义了你想要查看的层次结构的深度(dirs中的dirs),type f
定义文件,而不是type d
dirs。 exec
允许您处理找到的文件/目录,可以通过{}
访问。您也可以将其传递给bash函数以执行更多任务。
这个简单的bash脚本将dir作为参数并列出它的所有文件:
#!/bin/bash
find "$1" -maxdepth 1 -type f -exec echo "{}" \;
请注意,最后一行与find "$1" -maxdepth 1 -type f -print0
相同。
执行多项任务
使用find
还可以通过管道到xargs
或while read
来执行多项任务,但我更喜欢使用函数。一个例子:
#!/bin/bash
function dostuff {
# echo filename
echo "filename: $1"
# remove extension from file
mv "$1" "${1%.*}"
# get containing dir of file
dir="${1%/*}"
# get filename without containing dirs
file="${1##*/}"
# do more stuff like echoing results
echo "containing dir = $dir and file was called $file"
}; export -f dostuff
# export the function so you can call it in a subshell (important!!!)
find . -maxdepth 1 -type f -exec bash -c 'dostuff "{}"' \;
请注意,您需要导出该功能,如您所见。这样你就可以在子shell中调用它,它将通过执行bash -c 'dostuff'
来打开。要对其进行测试,我建议您在mv
中对dostuff
命令发表评论,否则您将删除所有扩展程序哈哈。
另请注意, 对于文件名中的空格等奇怪的字符是安全的,所以不用担心。
结束记录
如果您决定使用find
命令,这是一个很好的选择,我建议您阅读它,因为它是一个非常强大的工具。一个简单的man find
会教你很多,你将学习find
的许多有用选项。例如,一旦找到结果,您可以从查找中退出,这可以方便地检查dirs是否包含视频,例如以快速方式。它真的是一个可以在各种场合使用的神奇工具,通常你可以使用一个衬垫(有点像awk
)。
答案 1 :(得分:0)
如果只迭代单个目录下的文件,最好使用简单的文件名/路径扩展来避免某些不常见的文件名问题。以下将遍历作为第一个参数传递的给定目录中的所有文件(默认为./
):
#!/bin/bash
srchdir="${1:-.}"
for i in "$srchdir"/*; do
printf " %s\n" "$i"
done
如果您必须在包含众多分支的整个子树下面迭代,那么find
可能是您唯一的选择。但请注意,使用find
或ls
填充for
循环会带来嵌入字符问题的可能性,例如文件名中的\n
等。请参阅为什么 for i in $(find . -type f) # is wrong,尽管有时是不可避免的。
答案 2 :(得分:0)
您可以直接将文件读入数组,然后遍历它们:
#! /bin/bash
cd $1
files=(*)
for f in "${files[@]}"
do
echo $f
done