排序循环功能创建无限子目录

时间:2019-04-07 14:06:44

标签: bash loops sorting

我通常必须将多个文件夹中的大量图像分为“ .JPG”和“ .CR2”两种2种文件类型。我对bash相当陌生,但是创建了一个基本脚本,该脚本将成功地对单个文件夹进行排序,并将这些文件类型划分为不同的文件夹。

我在将其扩展到自动遍历子目录时遇到问题。我当前的脚本会创建一个无限循环的新子文件夹,直到终端超时。

如何在不循环浏览新文件夹的情况下使用循环功能?

function f {
    cd "$1"
            count=`ls -1 *.JPG 2>/dev/null | wc -l`
                if [ $count != 0 ]; then 
                    echo true
                    mkdir JPG; mv *.JPG jpg
                else
                    echo false
                fi
            count=`ls -1 *.CR2 2>/dev/null | wc -l`
                if [ $count != 0 ]; then 
                    echo true
                    mkdir RAW; mv *.CR2 raw;
                else
                    echo false
                fi
    for d in * .[!.]* ..?*; do
        cd "$1"
        test -d "$1/$d" && f "$1/$d"
    done
}

f "`pwd`"

1 个答案:

答案 0 :(得分:0)

我仍然建议人们在脚本中使用find,而不要使用**可能无法始终可靠地工作,可能会导致失败和混乱。

首先,我们创建目录以移至:

mkdir -p ./jpg ./cr2

请注意,如果目录已经存在,则-p中的mkdir不会使mkdir失败。

使用find。查找所有名为*.JPG的文件,并将每个文件移至jpg

find . -maxdepth 1 -mindepth 1 -name '*.JPG' -exec mv {} ./jpg \;
// similar
find . -maxdepth 1 -mindepth 1 -name '*.CR2' -exec mv {} ./cr2 \;

-maxdepth 1 -mindepth 1使得find不会递归扫描目录,这是默认设置。您可以删除它们,但是如果需要,可以添加-type f以仅包括文件。

脚本注释:

  • Don't parse ls output
  • 您可以使用find . -mindepth 1 -maxdepth 1 -file '*.jpg' -print . | wc -c来获取目录中的文件数。
  • for d in * .[!.]* ..?*; do我有一个模糊的想法,应该以某种方式递归扫描目录。如果目录JPG位于$(pwd)内,则将无限扫描到您自己中,并将文件移到您自己中,等等...如果目标文件夹在当前目录之外,只需修改find删除-mindepth 1脚本,然后将进行递归扫描。
  • 不要使用反引号,因为反引号的可读性较低,are deprecated。请改用$( .. )