gpt4 book ai didi

linux - 根据文件名对 Bash 中的 271,568 个文件进行排序

转载 作者:太空狗 更新时间:2023-10-29 12:43:19 28 4
gpt4 key购买 nike

我有 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

但它并没有真正发挥作用。

有人可以修复我的代码,或者自己编写代码来解决这个问题吗?谢谢!

最佳答案

忽略您请求的输出不可能在文件系统上表示(需要相同的名称来指代文件和目录):

#!/bin/bash
# ^^^^- must be bash shebang, must be shell 4.0 or newer

# first pass: count directory references
declare -A refcounts=( )
for f in *; do
f_part=$f
while [[ $f_part = *.* ]]; do
refcounts[$f_part]=$(( ${refcounts[$f_part]} + 1 ))
f_part=${f_part%.*}
done
refcounts[$f_part]=$(( ${refcounts[$f_part]} + 1 ))
done

# second pass: use that information
# ...this is some ugly code, but I don't have the time right now to make it simpler.
for f in *; do
f_part=${f%%.*}
f_rest=${f#*.}
while : "f=$f; f_part=$f_part; f_rest=$f_rest"; do
new_piece=${f_rest%%.*}
[[ $new_piece ]] || break
f_part_next=${f_part}.$new_piece
f_rest_next=${f_rest#"$new_piece"}; f_rest_next=${f_rest_next#.}
if [[ $f_rest = *.* ]] && (( ${refcounts[${f_part_next}]:-0} > 1 )); then
f_part=$f_part_next
f_rest=$f_rest_next
else
break
fi
done
dest="${f_part//"."/"/"}/${f_rest}"
mkdir -p -- "${dest%/*}"
mv -- "$f" "$dest"
done

关于linux - 根据文件名对 Bash 中的 271,568 个文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com