【发布时间】:2021-12-26 02:06:54
【问题描述】:
我正在尝试对数千个文件进行排序,并根据文件扩展名将它们放在自己的文件夹中。例如,将 JPG 文件放入 JPG 文件夹。
如何创建一个 for 循环来解决这个问题?
我尝试过的事情:
# This listed out all the file extensions and the count for each extension:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
#This was able to find all jpegs in the media folder
find /media -iname '*.jpg'
# This worked, however the MV command does not create the folder
find /media -iname '*.jpg' -exec mv '{}' /media/genesis/Passport/consolidated/jpg/ \; #
我猜测 for 循环会是这样的,但我似乎无法弄清楚:
for dir in 'find /media -iname "*.jpg"'; do
mkdir $dir;
mv $dir/*;
done
【问题讨论】:
-
/media中有多少级目录?可以使用find,但是如果您要递归查找并移动到单个目录,则必须决定如何处理重复的文件名。特别是如果有很多DSC_0001.JPG。还有exiftool,可以根据图片的元数据创建文件和目录命名方案。 -
在你的循环中检查 'echo ${dir##*/};回声 ${dir%/*}'
-
@dan 文件夹只有一层,但大约有 100 个文件夹。每个大约有 500-600 个文件。 (我不得不恢复一个分区被擦除的媒体硬盘驱动器,并且文件结构没有得到维护)
-
如果你使用
rename,也称为Perl rename或prename,你会有几个好处1)你不需要循环,2)你不需要创建输出目录,因为它为您制作,3) 您可以进行 “试运行”,4) 您可以使用 Perl 正则表达式的强大功能来提取、小写和修改文件名和 5 ) 如果您将1.jpg从两个不同的目录移动到一个共同的目标位置,它不会破坏文件。
标签: linux bash shell scripting