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