使用计数器

时间:2018-01-11 18:40:02

标签: 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>
         item_image-3-1.jpg
         ...
    3 -> Auction_Images -> <several image files> 
    my_script.sh  
  }

我希望能够进入每个编号目录,检查存在多少个文件/文件夹,如果只有一个意味着Auction_Images目录像文件夹3那么我想进入Auction_Images目录并将照片移出一个目录并重命名它们。到目前为止,我有以下内容:

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

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

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你可以使用这样的东西:

#!/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 =启用extended globbing
  • 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

您可以考虑使用C-style for loop

for (( x=1; x<=3; x++ )); do
    #do something
done

brace expansion

for x in {1..3}; do
    #do something
done

这样你就不必自己增加$x。最重要的是:

  1. 引用扩展= echo "$PWD"
  2. count=ls | wc -l =使用command substitution代替:count=$(ls | wc -l)
  3. Why you shouldn't parse the output of ls