Bash Shell脚本,用于使用计数器在while循环中移动文件

Bash Shell脚本,用于使用计数器在while循环中移动文件,bash,shell,Bash,Shell,我正在尝试将一些文件向下移动到一个目录并重命名它们 当前文件结构类似于以下内容: photos -> { 1 -> Auction_Images -> <several image files> item_image-1-1.jpg item_image-2-1.jpg ... 2 -> Auction_Images -> <several image files>

我正在尝试将一些文件向下移动到一个目录并重命名它们

当前文件结构类似于以下内容:

photos ->
  {
    1 -> Auction_Images -> <several image files>
         item_image-1-1.jpg
         item_image-2-1.jpg
         ...
    2 -> Auction_Images -> <several image files>
         item_image-3-1.jpg
         ...
    3 -> Auction_Images -> <several image files> 
    my_script.sh  
  }
x=1
while [ $x -le 3 ]
do
  cd $PWD/$x
  echo Changed to dir: $PWD
  count=ls | wc -l
  echo $count
  if [[ "$count" -eq 1 ]]
  then
    echo $PWD has 1 file/folder
  fi
  echo --------------------------------------------------
  cd ..
  x=$(( $x + 1 ))
done
我得到的结果是:

Changed to dir: /Users/jarvis/Desktop/imports/company/photos/1
       0

--------------------------------------------------
Changed to dir: /Users/jarvis/Desktop/imports/company/photos/2
       0

--------------------------------------------------
Changed to dir: /Users/jarvis/Desktop/imports/company/photos/3
       0
预期产出将是:

Changed to dir: /Users/jarvis/Desktop/imports/company/photos/1
       2

--------------------------------------------------
Changed to dir: /Users/jarvis/Desktop/imports/company/photos/2
       1

--------------------------------------------------
Changed to dir: /Users/jarvis/Desktop/imports/company/photos/3
       0

目前我遇到的问题是,
计数似乎没有被正确捕获。

如果我正确理解了这个问题,您可以使用以下方法:

#!/usr/bin/env bash

shopt -s nullglob extglob

for dir in +([0-9])/; do

    files=("$dir/"*)
    count=${#files[@]}  

    echo "$PWD/$dir"
    echo "$count"

    if (( count == 1 )); then
        #do something
        echo "Only one file/folder"
        mv -- "$files" /some/path/newname
    fi  

    echo "=============================="
done
  • shopt-s nullglob
    =确保在没有目录的情况下不会执行循环
  • shopt-s extglob
    =启用
  • for dir in+([0-9])/
    =仅在由一个或多个数字组成的目录上循环
  • files=(“$dir/”*)
    =将当前搜索目录中的所有文件存储到一个数组中
  • count=${#files[@]}
    =计算数组中的元素数--文件数
  • mv--“$files”/some/path/newname
    =将
    files
    数组中的第一个也是唯一一个元素移动到新位置(请注意,
    $files
    ${files[0]}
    的较短方法)

如果您不喜欢我使用的
for
循环,并且坚持使用此循环:

while [ $x -le 3 ]; do
    x=$(( $x + 1 ))
done

你可以考虑使用:

这样,您就不必自己增加
$x
。除此之外:

  • 报价扩展=
    echo“$PWD”

  • count=ls | wc-l
    =改用:
    count=$(ls | wc-l)

  • count=ls | wc-l
    是一条令人不快的指令。命令替换语法是
    $(..)
    。所以使用
    count=$(ls | wc-l)
    解析输出不是一个好的设计approch@Inian谢谢我感谢你的帮助。这是我写的第一个shell脚本,所以我还在学习。
    ls
    。要计算目录中的文件数,请参见。顺便说一句,将来,请尝试问一个更集中的问题——即,不要问你的脚本作为一个整体,而要问它的一部分不起作用。请参阅关于构建a的文档,描述问题中的代码示例应该如何成为演示给定问题的最小可能的东西。在这里,养成在提问之前解决由确定的问题的习惯也是值得的。
    for (( x=1; x<=3; x++ )); do
        #do something
    done
    
    for x in {1..3}; do
        #do something
    done