Bash 如何在unix中迭代目录的内容而不使用通配符?

Bash 如何在unix中迭代目录的内容而不使用通配符?,bash,unix,wildcard,Bash,Unix,Wildcard,我完全理解这里的问题所在 我有一组文件,前缀为“cat.jpg”和“dog.jpg”。我只想将“cat.jpg”文件移动到一个名为“cat”的目录中。与“dog.jpg”文件相同 for f in *.jpg; do name=`echo "$f"|sed 's/ -.*//'` firstThreeLetters=`echo "$name"|cut -c 1-3` dir="path/$firstThreeLetters" mv "$f" "$dir" done

我完全理解这里的问题所在

我有一组文件,前缀为“cat.jpg”和“dog.jpg”。我只想将“cat.jpg”文件移动到一个名为“cat”的目录中。与“dog.jpg”文件相同

for f in *.jpg; do
    name=`echo "$f"|sed 's/ -.*//'`
    firstThreeLetters=`echo "$name"|cut -c 1-3`
    dir="path/$firstThreeLetters"
    mv "$f" "$dir"
done
我得到这个信息:

mv:cannotstat'*.jpg':没有这样的文件或目录

那很好。但是如果不使用通配符,我找不到任何方法来迭代这些图像

我不想使用通配符。唯一的文件前面有“dog”或“cat”。我不需要匹配。所有文件都是.jpgs


我不能在不使用通配符的情况下迭代目录的内容吗?我知道这是一个XY问题,但我仍然想了解这一点。

*。当没有匹配的文件时,jpg
将生成文本
*。jpg
。 看起来您需要
nullglob
。使用Bash,您可以执行以下操作:

#!/bin/bash

shopt -s nullglob                # makes glob expand to nothing in case there are no matching files
for f in cat*.jpg dog*.jpg; do   # pick only cat & dog files
  first3=${f:0:3}                # grab first 3 characters of filename
  [[ -d "$first3" ]] || continue # skip if there is no such dir
  mv "$f" "$first3/$f"           # move
done

“你的问题不是通配符,而是它太包容了。”为什么?我只有目录中的JPG。没有隐藏的文件…我包括什么?
*。jpg
将匹配所有jpg文件,而您只需要以
cat
dog
开头的文件。幸运的是,目录中唯一的文件前面都有“dog”或“cat”。我不需要匹配…所有的文件都是.jpgs!这不是问题所在。我认为问题与使用通配符有关,当我到达
mv“$f”“$dir”
时,错误消息表明当前目录中没有.jpg文件。运行此脚本时,您是否在正确的目录中?