我正在尝试将某些文件移到目录中并重命名
当前文件结构如下所示:
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
似乎没有被正确捕获。
答案 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
for x in {1..3}; do
#do something
done
这样你就不必自己增加$x
。最重要的是:
echo "$PWD"
count=ls | wc -l
=使用command substitution代替:count=$(ls | wc -l)