【问题标题】:Bash scripting: Checking multiple file conditions in loopBash脚本:循环检查多个文件条件
【发布时间】:2020-09-25 16:08:15
【问题描述】:

如果目录具有扩展名文件:jpg、jpeg 或 png,我正在编写一个 bash 脚本来执行某些操作。但是当我尝试使用 for 或 while 循环检查这一点时,我搞砸了。

while [ filename in $IMAGE_DIR/*.jp*g -o filename in $IMAGE_DIR/*.png ] ; do
        # do something here

但我收到编译错误:

第 30 行:[:参数过多

我尝试了以下循环无济于事。

for (filename in $IMAGE_DIR/*.jp*g) || (filename in $IMAGE_DIR/*.png); do
while [ filename in $IMAGE_DIR/*.jp*g ] || [ filename in $IMAGE_DIR/*.png ] ; do
while [[ filename in $IMAGE_DIR/*.jp*g ]] || [[ filename in $IMAGE_DIR/*.png ]] ; do
while [[ filename in $IMAGE_DIR/*.jp*g ] || [ filename in $IMAGE_DIR/*.png ]] ; do
while (( filename in $IMAGE_DIR/*.jp*g )) || (( filename in $IMAGE_DIR/*.png )) ; do
while ( filename in $IMAGE_DIR/*.jp*g )) || (( filename in $IMAGE_DIR/*.png ) ; do

我在这里错过了什么?

【问题讨论】:

  • 你为什么不do_something *.jpg *.jpeg *.png 如果没有,你就什么都不做。或者使用find -name "*.jpeg" 或您想要的任何其他模式作为他们的名字,并将xargs 他们用于您的工作。没有理由检查所有文件名,shell 用一个命令或一个 glob 为您提供这些文件。
  • 您想要do something if the directory has files of extensions 还是想要迭代这些文件?如果这是 stackoverflow.com/questions/6363441/… 的副本?
  • @KamilCuk:只想遍历这些文件。

标签: bash loops conditional-statements


【解决方案1】:

这是我认为更容易迭代文件的多个“类型|扩展”的方式。我希望您知道如何继续,您可以在该 for 循环中创建 if 条件。

$ ls -l
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.jpeg
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.jpg
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.png
-rwxrwxr-x  1 lucas lucas   62 Sep 25 13:59  test.sh

$ cat test.sh 
#!/bin/bash
for i in *.jpg *jpeg *.png; do
  echo "hi $i"
done

$ ./test.sh 
hi test.jpg
hi test.jpeg
hi test.png

【讨论】:

  • echo "hi $i" 可以防止文件名中出现分词和特殊字符的问题。
  • @BenjaminW。你是对的。我会改进样品,谢谢
  • 没有shopt -s nullglob,当没有文件存在时,您将获得模式。我建议for ....; do if [ ! -e "$i" ]; then continue; fi; .... done
【解决方案2】:

您使用readarray 而不是“.txt”,只需输入您想要的任何扩展名。

readarray FILES <<< "$(find . -name "*.txt")";
for file in ${FILES[@]}; do
    echo $file
done  

【讨论】:

  • 这不就是写for file in *.txt的更复杂的方式吗?它还下降到子目录中,这可能需要也可能不需要。
猜你喜欢
  • 2013-03-10
  • 2015-04-04
  • 2014-10-30
  • 1970-01-01
  • 2023-04-06
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多