Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux BASH循环浏览文件夹和文件_Linux_Bash - Fatal编程技术网

Linux BASH循环浏览文件夹和文件

Linux BASH循环浏览文件夹和文件,linux,bash,Linux,Bash,我有一个问题,通过目录列出。我想制作一个脚本,它将循环遍历目录和其中的文件,这样我就可以将它们移到其他地方 我的问题是我需要对文件夹中的所有文件进行排序。大约有2000个目录,我需要循环遍历它们,然后遍历这些目录中的所有文件,并在将要创建的目录(或将要移动的文件)中按扩展名对它们进行排序,它的名称就是那个特定的扩展名 有人能帮忙吗 #!/bin/bash tar_fol="$HOME/Desktop/try/" to_fol="$HOME/Desktop/SortedFiles/" for

我有一个问题,通过目录列出。我想制作一个脚本,它将循环遍历目录和其中的文件,这样我就可以将它们移到其他地方

我的问题是我需要对文件夹中的所有文件进行排序。大约有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

您可以使用
ls
命令

cd $HOME/Desktop/try/
ls -laRX


有关更多信息,请参阅
man ls

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

无论如何,您也应该避免对私有变量使用大写

#!/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
中的目标目录(隐晦的hack,但这很常见)和找到的文件传递给
-exec
脚本。

除了
$FILE
(第17行)可能更改为
$FIL
,您能否更好地描述您遇到的问题(如果您的脚本不工作)?谢谢你的更正。我的问题是我需要对文件夹中的所有文件进行排序。大约有2000个目录,我需要遍历它们,然后遍历这些目录中的所有文件,并在将要创建的目录(或将要移动的文件)中按扩展名对它们进行排序,它的名称将是,特定的扩展名问题是,'6 for DIRE in
“$(ls-d$tar\u fol”*”)
给我一个错误请提供一个用作输入和预期输出的目录结构示例。很好,我从来没有听说过
-X
,真的有一个工具可以处理所有事情!第一个循环用于遍历文件夹,第二个循环用于遍历这些文件夹中的文件。无论如何,谢谢你的回复。顺便说一句:
find:缺少-exec'
的参数,对此表示抱歉;添加了
{}
,我猜这就是它所抱怨的。如果您的
查找
不支持
-exec。。。{}\+
需要一些额外的重构。我的问题是关于最里面的循环——我用一个
find
替换了这个循环。这个循环用于列出文件夹中的文件,因此如果文件的扩展名是.txt,那么如果
中存在与文件扩展名同名的目录,请将该文件移动到那里,如果没有,则在
到_fol
中使用扩展名(循环中列出的文件的扩展名)创建新目录,并将该文件移动到该文件夹基本上,我的问题是需要对SSD恢复中的所有文件进行排序。大约有1500个文件夹,500个文件。我需要按文件的扩展名对每种类型的文件进行排序,以分离文件夹,然后可能
find~/Desktop-typef-name“*.${fil##*.}”-exec sh-c'mkdir-p“$@”;mv“$@”“$0”“”$to#fol/${fil##*.}{}\+
但我想这将多次执行相同的扩展,因此您应该优化掉这些情况(通过管道
排序-u
?如果
$to#fol
中的目录已经存在,则跳过此操作)
#!/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