无法遍历目录中的所有文件

时间:2015-04-12 01:08:26

标签: bash ubuntu

我的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语句只显示一次。

3 个答案:

答案 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还可以通过管道到xargswhile 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可能是您唯一的选择。但请注意,使用findls填充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