BASH循环遍历文件夹和文件

时间:2016-06-03 08:07:52

标签: linux bash

我在目录列表中遇到问题。我想制作脚本,它将循环通过目录中的dirs和文件,以便我可以将它们移动到别处。

我的问题是我需要排序文件夹中的所有文件。有2000个目录,我需要遍历它们然后循环遍历这些目录中的所有文件,并在目录中按扩展名对它们进行排序(或者将移动文件),它的名称将会是那个特定的扩展

有人可以帮忙吗?

#!/bin/bash

tar_fol="$HOME/Desktop/try/"
to_fol="$HOME/Desktop/SortedFiles/"

for DIRE in "$(ls -d  $tar_fol"*")"
do

  echo "Checking dir : $DIRE"

  for FIL in "$(ls -p $tar_fol$DIRE)"
  do
    echo "Checking file : $FIL"

    if [ "$(find ~/Desktop/ -type d -name ${FIL##*.})" != "" ]
      then
          mv -f $tar_fol$FIL $to_fol${FIL##*.}
      else
        mkdir $to_fol${FIL##*.}
        mv $tar_fol$FIL $to_fol${FIL##*.}
      fi

  done
done

2 个答案:

答案 0 :(得分:2)

您正在引用通配符,因此您要查找名称​​字面以字符*结尾的文件。

无论如何,you should not use ls to drive loops,还应该避免使用大写字母作为私有变量。

#!/bin/bash

tar_fol="$HOME/Desktop/try/"
to_fol="$HOME/Desktop/SortedFiles/"

for dire in "$tar_fol"/*/.
do
  echo "Checking dir: '$dire'"
  for fil in "$dire"/*
  do
    echo "Checking file: '$fil'"
    find ~/Desktop/ -type d -name "${fil##*.}" -exec sh -c 'mkdir -p "$0";
        mv "$@" "$0"' "$to_fol" "$fil" {} \+
  done
done

我不确定我究竟究竟最内层循环应该完成什么,因此有一些猜测。一般的想法是将$0中的目标目录(隐藏的黑客,但它相当常见)和找到的文件传递给-exec脚本。

答案 1 :(得分:0)

您可以使用ls命令

cd $HOME/Desktop/try/
ls -laRX

OR

ls -laRX $HOME/Desktop/try/

   -l     use a long listing format
   -a, --all do not ignore entries starting with .
   -R, --recursive
          list subdirectories recursively
   -X     sort alphabetically by entry extension

有关详细信息,请参阅man ls