根据第一个字符将目录移动到子目录

根据第一个字符将目录移动到子目录

我想将目录移动到另一个位置并按首字母移动到子目录中。例如: ./alpha 将移动到 /otherdir/a/ ./beta 将移动到 /otherdir/b/ 所有子目录都已创建,并且它是一个固定集,因此我不需要担心检查或创建这些子目录。我希望使用 的输出 find . -type d -name "[a-z*]" ,当我运行 时 find . -type d -name "[a-z*]" | xargs mv -t /dest/,所有目录都会被移动,但当然不会移动到子目录中。我不知道是否可以使用组件的第二个参数/dest/first character here/,传递每个目录名称的第一个字符。有没有办法做到这一点,或者有不同的方法来a)生成目录列表和b)将目录名称和第一个字符传递给移动命令?

答案1

没有使用的理由find(除非目录数量巨大)。

dest_root='/otherdir'
for dir in [a-z]*; do
    [ -d "${dir}" ] && mv "${dir}" "${dest_root}/${dir:0:1}"
done

答案2

您需要选取目录的第一个字母。通过find循环运行输出可以很容易地做到这一点。例如,

for i in $(find . -type d -name "[a-z]*")
do
    echo ${i:2:1}
done

此命令为您提供每个目录的第一个字母,忽略前导./.要将其移至目标位置,您必须将该目录放在其他位置(当前目录之上)以避免递归移动。假设您的目标目录位于../dest/a../dest/b、等等。您可以将echo命令替换为mv,上面的循环可以变为

destination="../dest"
for i in $(find . -type d -name "[a-z]*")
do
    mv ${i} ${destination}/${i:2:1}
done

您必须根据目的地进行调整。

相关内容