【发布时间】:2016-04-08 18:17:43
【问题描述】:
我有 271,568 个需要排序的文件的集合,它们都在同一个目录中。幸运的是,它们都可以根据它们所在的文件夹方便地命名。
例如,一小部分文件可能如下所示:
.
├── file.sort.shamwow
├── file.sort.shamwow.abc
├── file.sort.shamwow.example.alsoafile
├── file.sort.shamwow.example.file
├── foo.bar
├── foo.bar.a
├── foo.bar.b
├── foo.lel
├── foo.wow.a.50
└── foo.wow.b
当它们完成排序后,它们应该如下所示:
.
├── file
│ └── sort
│ └── shamwow
│ ├── example
│ │ ├── file.sort.shamwow.example.alsoafile
│ │ └── file.sort.shamwow.example.file
│ ├── file.sort.shamwow
│ └── file.sort.shamwow.abc
└── foo
├── bar
│ ├── foo.bar
│ ├── foo.bar.a
│ └── foo.bar.b
├── foo.lel
└── wow
├── foo.wow.a.50
└── foo.wow.b
因此,文件 foo.wow.a.50 将被放置在目录 wow 内,即目录 foo 内,以此类推所有文件。
我想要的程序会根据点在目录中的位置对文件进行排序。但是,如果该文件夹中只有一个文件(例如 foo/wow/a.50),则不会仅为该文件创建新文件夹。
现在,我的半功能脚本如下所示:
#!/bin/bash
#organization for gigantic folder
> foo.txt
for f in *; do
d=${f:3}
d=${d%%.*}
d=${d%%.*}
echo $d
if grep -Fxq "$d" foo.txt
then
mkdir -p $d
mv $f $d
else
echo $d >> foo.txt
fi
done
rm foo.txt
但它并没有那么好。
有人可以修复我的代码,或者自己动手整理一下这个烂摊子吗?谢谢!
【问题讨论】:
-
我建议您将
ls引用从您的问题中取出——它往往会为您提供一堆指向mywiki.wooledge.org/ParsingLs 的链接,而您的问题实际上不需要任何使用ls在所有。 -
@CharlesDuffy 感谢您的建议。我将其更改为“根据文件名对 Bash 中的 271,568 个文件进行排序”。
-
BTW,不能有三个文件分别命名为
foo/bar、foo/bar/a和foo/bar/b,后两者的目录名会和文件名冲突对于前者。 -
我和达菲在一起;至少您需要知道如何处理 foo.bar 的情况: foo/ 中的一个名为 foo.bar 的文件? foo/bar/ 中的文件也称为 bar?跳过它?
-
那么你想要的输出不应该是
foo/wow/a.50foo/wow/b而不是foo/wow.a.50foo/wow.b吗?
标签: linux bash file sorting filesystems