我通常必须将多个文件夹中的大量图像分为“ .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`"
答案 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
以仅包括文件。
脚本注释:
find . -mindepth 1 -maxdepth 1 -file '*.jpg' -print . | wc -c
来获取目录中的文件数。for d in * .[!.]* ..?*; do
我有一个模糊的想法,应该以某种方式递归扫描目录。如果目录JPG
位于$(pwd)
内,则将无限扫描到您自己中,并将文件移到您自己中,等等...如果目标文件夹在当前目录之外,只需修改find
删除-mindepth 1
脚本,然后将进行递归扫描。$( .. )
。